Как мне выполнить левое соединение на null
в Eloquent построителе запросов?
У меня есть 2 модели: Customer
(customers
таблица) и Appointment
(appointments
таблица). У клиента может быть 0 или более встреч. И клиенты, и встречи могут быть мягко удалены.
Я хотел бы повторить этот запрос в Query Builder:
Запрос 1 :
SELECT max(a.date) AS max_date, c.* FROM customers AS c
LEFT JOIN appointments AS a ON a.customer_id = c.id AND a.deleted_at IS NULL
WHERE c.deleted_at IS NULL
GROUP BY c.id;
Я знаю, что это:
Customer::selectRaw('max(appointments.date) as max_date, customers.*')
->leftJoin('appointments', 'appointments.customer_id', '=', 'customers.id')
->where('appointments.deleted_at')
->groupBy('customers.id');
Результаты в этом:
Запрос 2 :
SELECT max(a.date) AS max_date, c.* FROM customers AS c
LEFT JOIN appointments AS a ON a.customer_id = c.id
WHERE c.deleted_at IS NULL AND a.deleted_at IS NULL
GROUP BY c.id;
Но между Query 1 и Query 2 :
есть небольшая разница
Запрос 1 включает в себя клиентов, у которых все встречи были удалены (и это то, что я хочу). Запрос 2 нет.
Есть ли способ сделать это в Eloquent, не прибегая к подзапросам? Выходные данные этого запроса поступают в представление «индекс» со 100 (или более) записями на страницу , поэтому я не хочу излишне замедлять его. Я также хочу, чтобы пользователь мог сортировать результаты по максимальной дате.
Является ли мой единственный разумный вариант простым "запросом sql"?