You need to enable JavaScript to run this app. 如何使用Laravel查询构造器编写带复杂嵌套ON条件的Left Join语句
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 19:39:00