如何使用Laravel查询构造器编写带复杂嵌套ON条件的Left Join语句
解决方案
你可以通过Laravel查询构造器的嵌套条件分组功能实现对应SQL的逻辑优先级,修正后的代码如下:
->leftJoin('grade_level as f', function ($join) { // 对应原生条件:a.customer_type = 1 $join->where('a.customer_type', '=', 1); // 嵌套分组处理OR两侧的条件,避免逻辑优先级混乱 $join->on(function ($conditionGroup) { // 第一个OR分支:e.id为空时用d表的年级ID关联 $conditionGroup->on(function ($branch1) { $branch1->whereNull('e.id') ->on('d.grade_level_id', '=', 'f.grade_level_id'); }); // 第二个OR分支:e.id不为空时用e表的年级ID关联 $conditionGroup->orOn(function ($branch2) { $branch2->whereNotNull('e.id') ->on('e.grade_level_id', '=', 'f.grade_level_id'); }); }); })
修正说明
- 所有
AND/OR组合条件通过嵌套闭包做分组,严格对应原生SQL的括号优先级,避免逻辑错误 - 字段空值判断使用
whereNull/whereNotNull方法,替代错误的空字符串等值判断 - 字段和常量对比使用
where方法,on方法仅用于两个表字段的等值对比 - 别名保持和你提供的原生SQL一致,若实际业务中表别名不同,替换对应字段前缀即可
内容的提问来源于stack exchange,提问作者Jericho Cosico
相关产品推荐
相关产品推荐

