Я пытаюсь вернуть значение, присоединившись к другой таблице в запросе, но возможно ли включать элемент в конечные результаты, если не было найдено значение из вторичной таблицы ?Запрос запроса 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
Я думаю, что вы хотите 'left_join: h в Homework' (вместо' join'). Это должно дать вам «домашнее задание: ноль», но я не могу проверить без дополнительной информации о схеме. – Dogbert
Эй, @ Dogbert, я попробовал ваше предложение, но это не помогло. Таким образом, я добавляю схему – Ilya
Ах, правильно. Игнорировать мой комментарий; 'left join' здесь ничего не сделает, поскольку условие находится в' where'. – Dogbert