如何将嵌套RIGHT JOIN语句转换为Laravel Query Builder写法?
解决方案:将嵌套RIGHT JOIN转换为Laravel Query Builder写法
你的原SQL是嵌套结构的RIGHT JOIN,需要用Laravel Query Builder的闭包或子查询方法来实现,以下是两种可行的写法:
方法一:使用闭包嵌套JOIN
->rightJoin(function ($join) { // 定义子查询中的RIGHT JOIN:tlkpSUDesc RIGHT JOIN tblSU $join->from('tlkpSUDesc') ->rightJoin('tblSU', 'tlkpSUDesc.SUDescCode', '=', 'tblSU.SUDescCode'); }, function ($join) { // 外层RIGHT JOIN的连接条件 $join->on('tlkpSUTyp.SUTypCode', '=', 'tblSU.SUTypCode'); })
方法二:使用rightJoinSub子查询方法
// 先定义子查询 $subQuery = DB::table('tlkpSUDesc') ->rightJoin('tblSU', 'tlkpSUDesc.SUDescCode', '=', 'tblSU.SUDescCode'); // 将子查询作为右表进行RIGHT JOIN $query->rightJoinSub($subQuery, 'sub', function ($join) { $join->on('tlkpSUTyp.SUTypCode', '=', 'sub.SUTypCode'); });
你的两种写法问题分析
第一种写法:
- 闭包内的
on方法参数错误,正确格式应为$join->on('关联字段1', '=', '关联字段2'),不需要把表名放在第一个参数位置。 - 语法不完整,闭包结束后缺少逗号,导致后续的连接条件无法被正确解析。
- 闭包内的
第二种写法:
- 没有处理嵌套结构,连续执行两次独立的RIGHT JOIN会改变原SQL的逻辑。原SQL是先让
tlkpSUDesc与tblSU完成RIGHT JOIN,再将结果与tlkpSUTyp做RIGHT JOIN;而连续的RIGHT JOIN会让tlkpSUTyp先关联tlkpSUDesc,再关联tblSU,逻辑完全不符。
- 没有处理嵌套结构,连续执行两次独立的RIGHT JOIN会改变原SQL的逻辑。原SQL是先让
内容的提问来源于stack exchange,提问作者stanhook
相关产品推荐
相关产品推荐

