当前位置: 首页 > 知识库问答 >
问题:

Laravel查询生成器左联接中的两个表

西门正平
2023-03-14

我有下面的查询,我正试图将其转换为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 commentslibrary\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和我所有的依赖是最新的(作曲家更新


共有3个答案

轩辕风华
2023-03-14

经过一番修补,我终于从两个部分找到了答案:

首先,我必须调整连接的这一部分:

on('report_comments.report_id', '=', '1')

并将其替换为:

where('report_comments.report_id', '=', '1')

如果我不这样做,Laravel会用反勾号引用1,导致MySQL将其解释为一个列名。

另一个变化是使用DB::原始,这是我试图避免的,但我不认为在这种情况下太糟糕,因为我传递的是硬编码字符串,而不是用户输入(或任何受用户输入影响的内容)。leftJoin现在看起来像:

leftJoin(DB::raw('(report_comments, library_comments)')
邵华皓
2023-03-14

不确定这是否行得通,但我认为这将是沿着这些路线的事情,希望你能从中得到一些东西。

基本上添加了一个检查,以查看该关系是否存在,如果确实存在,则加入该关系。

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');
          }

})
周昊乾
2023-03-14

使用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为空。