You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8能否实现查询构造器多层逻辑分组?附相关代码示例

Laravel 8 多层查询分组实现方案

Laravel 8 完全支持查询构造器的多层逻辑分组功能,你遇到的SQL逻辑错误是闭包嵌套层级不符合预期导致的。

错误原因

你原有代码将master_type_id分组和due_date条件分别放在两个平级的where/orWhere闭包中,导致逻辑优先级计算错误,没有把所有OR条件包裹到同一个父分组中。

正确实现代码

$ItrDays = Itr::where(function ($query) {
    // 内层分组:匹配两个master_type_id的OR逻辑
    $query->where(function ($subQuery) {
        $subQuery->where('master_type_id', 'Urgent ITR')
            ->orWhere('master_type_id', 'One time ITR');
    })
    // 和上面的分组做OR运算
    ->orWhere('due_date', '<', Carbon::now()->addDays(10));
})
// 外层AND条件:和前面整个OR分组做逻辑与
->when($admin == 0, function ($query) {
    return $query->where('assigned_to', auth()->user()->id);
});

dd($ItrDays->toSql());

代码优化建议

针对同字段多个OR等值判断的场景,可以用whereIn简化写法,省略一层子闭包,逻辑完全等价:

$ItrDays = Itr::where(function ($query) {
    $query->whereIn('master_type_id', ['Urgent ITR', 'One time ITR'])
        ->orWhere('due_date', '<', Carbon::now()->addDays(10));
})
->when($admin == 0, function ($query) {
    return $query->where('assigned_to', auth()->user()->id);
});

执行上述代码生成的SQL将完全匹配你预期的查询逻辑。

内容的提问来源于stack exchange,提问作者Devsi Odedra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 11:12:02