Я активно работаю над проектом laravel и столкнулся с некоторыми проблемами в Query Builder. Я пытаюсь избежать использования DB :: Raw, но похоже, что мне может понадобиться.
$query = app($this->model());
$query = $query->select(['last_name', 'first_name', 'birthday'])
->distinct()
->leftJoin('enrollments', 'students_meta.uid', '=', 'enrollments.student_uid')
->whereIn('enrollments.type', $types)
->where('enrollments.startdate', '<=', "'{$today}'")
->where(function ($join) use ($today) {
$join->where('enrollments.dropdate', '>=', "'{$today}'")
->orWhereNull('enrollments.dropdate');
});
// todo: add viewBy filter
$query = $query->where('birth_month', '=', Carbon::today()->month);
$query = $query->orderBy('last_name')->orderBy('first_name');
$models = $query->get();
Вышеупомянутый построитель запросов генерирует следующий SQL:
SELECT distinct `last_name`, `first_name`, `birthday`
FROM `students_meta`
LEFT JOIN `enrollments` ON `students_meta`.`uid` = `enrollments`.`student_uid`
WHERE `enrollments`.`type` IN ('ACTIVE', 'active')
AND `enrollments`.`startdate` <= '2019-10-29'
AND (`enrollments`.`dropdate` >= '2019-10-29' OR `enrollments`.`dropdate` IS NULL)
AND `birth_month` = 10
ORDER BY `last_name` asc, `first_name` asc;
Сгенерированный SQLидеально подходит на основе старого кода, с которого я перехожу, и дает ожидаемые результаты. Если я перенесу некоторые вещи, мне кажется, что я смогу заставить построитель запросов вернуть результаты, но они не правильные. Я посмотрел на другие вопросы / ответы об этой проблеме и попробовал несколько сценариев перемещения соединения / изменения места вокруг, но все же не повезло.
Есть предложения? (кроме взятия сгенерированного sql и запуска его в DB :: Raw ()