我有下面的查询,我正试图将其转换为Laravel的查询生成器,以便利用自动转义等功能。
SELECT subjects.name, report_comments.comment
FROM subjects
LEFT JOIN (report_comments, library_comments) ON subjects.id = library_comments.subject_id
AND report_comments.library_comment_id = library_comments.id
AND report_comments.report_id = 1
实际上,查询所说的是“获取所有主题的名称,如果它们有匹配的report_comment(通过中间的library_comments
表),将其与主题一起返回”(对于给定的条件,主题有一个或零report_comments)...如果我直接在MySQL中运行查询并返回我期望的结果,查询就可以工作。report_comment.report_id=1
目前是硬编码的,但最终将成为占位符,以便可以传入任何report_id
。
到目前为止,我已经设法得到:
DB::table('subjects')->select(['subjects.name', 'report_comments.comment'])->leftJoin('report_comments', function ($join) {
$join->on('subjects.id', '=', 'library_comments.subject_id')
->on('report_comments.library_comment_id', '=', 'library_comments.id')
->on('report_comments.report_id', '=', '1');
})
如果我将添加到SQL
中,结果是:
select `subjects`.`name`, `report_comments`.`comment` from `subjects` left join `report_comments` on `subjects`.`id` = `library_comments`.`subject_id` and `report_comments`.`library_comment_id` = `library_comments`.`id` and `report_comments`.`report_id` = `1`
这几乎就是我想要的,除了它失败了,因为根本没有提到library_comments
表:
Illuminate/Database/QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'library_comments.subject_id' in 'on clause' (SQL: select `subjects`.`name`, `report_comments`.`comment` from `subjects` left join `report_comments` on `subjects`.`id` = `library_comments`.`subject_id` and `report_comments`.`library_comment_id` = `library_comments`.`id` and `report_comments`.`report_id` = `1`)'
我需要做的是告诉leftJoin
函数关于report\u comments
和library\u comments
,但似乎没有任何方法可以做到这一点。我试过:
leftJoin(['report\u comments','library\u comments',函数($join)
据猜测,Laravel可能会将表名数组转换为(报表注释、库注释)
,但这不起作用,并给了我以下警告:
PHP Notice: Array to string conversion in /home/paul/sites/report-assistant/vendor/laravel/framework/src/Illuminate/Database/Grammar.php on line 39
有没有办法将多个表传递到leftJoin
,或者我需要完全重写查询才能使用Laravel的查询生成器?
我使用的laravel/框架
版本5.8.21和我所有的依赖是最新的(作曲家更新
经过一番修补,我终于从两个部分找到了答案:
首先,我必须调整连接的这一部分:
on('report_comments.report_id', '=', '1')
并将其替换为:
where('report_comments.report_id', '=', '1')
如果我不这样做,Laravel会用反勾号引用1
,导致MySQL将其解释为一个列名。
另一个变化是使用DB::原始
,这是我试图避免的,但我不认为在这种情况下太糟糕,因为我传递的是硬编码字符串,而不是用户输入(或任何受用户输入影响的内容)。leftJoin
现在看起来像:
leftJoin(DB::raw('(report_comments, library_comments)')
不确定这是否行得通,但我认为这将是沿着这些路线的事情,希望你能从中得到一些东西。
基本上添加了一个检查,以查看该关系是否存在,如果确实存在,则加入该关系。
Subject::select('subjects.name, report_comments.comment')
->leftJoin('library_comments', 'subjects.id, '=', library_comments.subject_id')
->leftJoin('report_comments', function($join){
if(report->library->relationship){
$join->on('report_comments.library_comment_id', '=', 'library_comments.id')
->where('report_comments.report_id', '=', '1');
}
})
使用BD::raw
写查询像这样和它将工作
DB::table('subjects')->select(['subjects.name, report_comments.comment'])->leftJoin(DB::raw('(report_comments, library_comments)'), function ($join) {
$join->on('subjects.id', '=', 'library_comments.subject_id')
->on('report_comments.library_comment_id', '=', 'library_comments.id')
->on('report_comments.report_id', '=', '1');
})
我试图从一个表中选择所有结果,并在用户ID匹配时与另一个表合并。 我有三个表:runs、users和一个run\u用户透视表。我想从数据透视表中的“运行”和其他列(即“已完成”、“粘性”、“上次测试”和“难度”)中选择所有结果,但只从当前用户的“运行用户”中提取数据。 在原始SQL中,我通过一个带有AND语句的左连接成功地做到了这一点: 如何通过查询生成器执行此操作,有何建议?我可以在Larave
我一直在理解Laravel查询生成器和纯SQL之间的融合。 我有2张桌子: user:包含具有主键的用户 User_Action:这是一个表,其中包含由和动作的组成的PRIMARYs记录。 ex: 使用者 用户操作 我的需要: 现在我想检索一个用户列表,其中包含每个用户的最新操作。因此,我只需要在从到的连接中获取一行,并且这一行必须是具有最新日期时间的一行。我的前任也是如此;我只想获取dateti
但是,我的查询生成器是错误的。它会显示错误消息 SQLState[42000]:语法错误或访问冲突:1064您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册以获得正确的语法 和生成的SQL SQL:从左联接中选择.*(内联接对。=。和。=。和 谁能帮我解决我的问题?多谢了。
我有一个问题,使laravel查询: 我想举个例子: 我有这个但不起作用:
我想在查询生成器laravel中orderBy 因为我的是类型 所以当它排序的时候...结果远远不是我想要的... 我的剧本就像这样 我已经试过了 我如何铸造OrderBy查询生成器,以便我可以排序desc
我正在使用Laravels查询生成器检索带有一些筛选选项的项目列表-我需要在此查询中进行计数: 计算“Freestyle ID”在likes表中出现的次数。 这有可能吗?返回的数据是完美的,我只需要一个自由泳的喜欢量,其中喜欢表中的自由泳ID为空。