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
相关产品推荐
相关产品推荐

