我正在积极从事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()中运行它之外
答案 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)
确保从查询中的所有此类实例中删除引号。