Laravel查询生成器完美生成的SQL时不返回任何结果

时间:2019-10-30 16:09:15

标签: php laravel laravel-query-builder

我正在积极从事laravel项目的工作,并且在查询生成器中遇到了一些问题。我正在尝试避免使用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 个答案:

答案 0 :(得分:1)

$query = $query->orderBy('last_name')->orderBy('first_name')->get();

您的查询工作正常,但没有输出。

您还可以使用->get()->toArray();检索数组格式的数据

答案 1 :(得分:1)

$today左右删除报价。 where子句的第三个(或第二个,如果消除比较运算符)参数将值作为预准备语句中的参数发送。所以

 "'{$today}'"

在直接查询中看起来像这样:

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

因此将查询更改为

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

确保从查询中的所有此类实例中删除引号。