Осталось присоединиться к нулю - PullRequest
0 голосов
/ 06 сентября 2018

Как мне выполнить левое соединение на 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"?

1 Ответ

0 голосов
/ 07 сентября 2018

leftJoin() принимает закрытие:

Customer::selectRaw('max(appointments.date) as max_date, customers.*')
    ->leftJoin('appointments', function($join) {
        $join->on('appointments.customer_id', '=', 'customers.id')
            ->where('appointments.deleted_at');
    })
    ->groupBy('customers.id');
...