Laravel 查询生成器 returns 生成时没有结果 SQL 完美
Laravel Query Builder returns no results while generated SQL works perfect
我正在积极从事 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 是完美的,基于我正在移动的旧代码并产生了预期的结果。如果我四处移动一些东西,似乎我可以让查询生成器得到 return 结果,但它们不是正确的。我已经查看了其他 questions/answers 关于此类问题的内容,并尝试了多种将 join/changing 移动到附近位置的方案,但仍然没有成功。
有什么建议吗? (除了在 DB::Raw()
中获取生成的 sql 和 运行
$query = $query->orderBy('last_name')->orderBy('first_name')->get();
您的查询工作正常,但您没有输出它。
您还可以使用->get()->toArray();
以数组格式检索数据
从 $today
左右删除引号。 where 子句的第三个(或第二个,如果删除比较运算符)参数将值作为预准备语句中的参数发送。所以
"'{$today}'"
在直接查询中看起来像这样:
where enrollments.startdate <= "'2019-10-29'"
所以将您的查询更改为
->where('enrollments.startdate', '<=', $today)
确保在查询中删除所有此类实例的引号。
我正在积极从事 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 是完美的,基于我正在移动的旧代码并产生了预期的结果。如果我四处移动一些东西,似乎我可以让查询生成器得到 return 结果,但它们不是正确的。我已经查看了其他 questions/answers 关于此类问题的内容,并尝试了多种将 join/changing 移动到附近位置的方案,但仍然没有成功。
有什么建议吗? (除了在 DB::Raw()
中获取生成的 sql 和 运行$query = $query->orderBy('last_name')->orderBy('first_name')->get();
您的查询工作正常,但您没有输出它。
您还可以使用->get()->toArray();
以数组格式检索数据
从 $today
左右删除引号。 where 子句的第三个(或第二个,如果删除比较运算符)参数将值作为预准备语句中的参数发送。所以
"'{$today}'"
在直接查询中看起来像这样:
where enrollments.startdate <= "'2019-10-29'"
所以将您的查询更改为
->where('enrollments.startdate', '<=', $today)
确保在查询中删除所有此类实例的引号。