2017-02-03 1 views
0

Я пытаюсь вернуть значение, присоединившись к другой таблице в запросе, но возможно ли включать элемент в конечные результаты, если не было найдено значение из вторичной таблицы ?Запрос запроса Elixir/Phoenix пустой, если условие не выполнено

Вот мой запрос:

Repo.all(from p in Subjectclass, where: p.user_id == ^user.id, 
              join: f in Subject, 
              on: p.subject_id == f.id, 
              join: z in Schedule, 
              on: f.id == z.subject_id, 
              where: z.weekday == 1, 
              join: t in User, 
              on: f.user_id == t.id, 
              join: h in Homework, 
              on: f.id == h.subject_id, 
              where: h.deadline == ^this_monday, 
              group_by: f.title, 
              group_by: t.surname, 
              group_by: z.timeslot_id, 
              group_by: h.body, 
              order_by: z.timeslot_id, 
              select: %{title: f.title, teacher: t.surname, homework: h.body}) 

Что происходит where: h.deadline == ^this_monday, проверяет, есть ли домашние задания на этот день для субъектов. Но если нет (предмет без домашней работы), он просто удаляет весь элемент из конечного результата.

Мой вопрос: возможно ли включить этот элемент без домашней работы (т.е. название: «Математика», учитель: «Боб», домашнее задание: «») в конечном результате (выберите :) или каким-то образом замените пространство? В текущем коде он просто удаляет весь элемент из конечного результата.

Спасибо заранее!

Schemas:

schema "subjectclasses" do 
    belongs_to :user, Kz.User 
    belongs_to :subject, Kz.Subject 
    timestamps() 
end 

schema "subjects" do 
    field :lvl, :integer 
    field :title, :string 
    field :week, :integer 
    belongs_to :user, Kz.User 
    has_many :subjectclasses, Kz.Subjectclass 
    timestamps() 
end 

schema "schedules" do 
    field :subject_id, :integer 
    field :weekday, :integer 
    belongs_to :timeslot, Kz.Timeslot 
    timestamps() 
end 

schema "users" do 
    field :firstname, :string 
    field :surname, :string 
    field :level, :integer 
    field :username, :string 
    field :encrypted_password, :string 
    belongs_to :role, Kz.Role 
    has_many :subjects, Kz.Subject 
    has_many :subjectclasses, Kz.Subjectclass 
    field :password, :string, virtual: true 
    timestamps() 
end 

schema "homeworks" do 
    field :body, :string 
    field :deadline, Ecto.Date 
    belongs_to :subject, Kz.Subject 
    timestamps() 
end 
+0

Я думаю, что вы хотите 'left_join: h в Homework' (вместо' join'). Это должно дать вам «домашнее задание: ноль», но я не могу проверить без дополнительной информации о схеме. – Dogbert

+0

Эй, @ Dogbert, я попробовал ваше предложение, но это не помогло. Таким образом, я добавляю схему – Ilya

+0

Ах, правильно. Игнорировать мой комментарий; 'left join' здесь ничего не сделает, поскольку условие находится в' where'. – Dogbert

ответ

0

решаемые его:

left_join: h in Homework, 
on: f.id == h.subject_id and h.deadline == ^this_monday, 

так, чтобы присоединиться на уникальных полей в таблице Домашнее задание.