Laravel Query Builder не возвращает результатов, в то время как сгенерированный SQL работает отлично - PullRequest
0 голосов
/ 30 октября 2019

Я активно работаю над проектом 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 ()

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Удалить ваши цитаты из примерно $today. Третий (или второй, если исключить оператор сравнения) параметр where отправляет значения в качестве параметра в подготовленном операторе. Так что

 "'{$today}'"

будет выглядеть следующим образом:

where enrollments.startdate <= "'2019-10-29'"

Поэтому измените ваш запрос на

 ->where('enrollments.startdate', '<=', $today)

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

1 голос
/ 30 октября 2019
$query = $query->orderBy('last_name')->orderBy('first_name')->get();

Ваш запрос работал нормально, но вы его не выводили.

Вы также можете использовать ->get()->toArray(); для извлечения данных в формате массива

...