Laravel Eloquent查询作用域:双条件控制结果及无数据场景处理
Laravel Eloquent 查询作用域优化方案
最优解决方案:添加永假条件返回空集
当两个条件都为假时,只需给查询添加一个永远不成立的条件,就能直接返回空结果集,避免返回所有数据。最简洁高效的写法是用whereRaw('1=0')(兼容性覆盖所有Laravel版本),Laravel 8+也可使用whereFalse()方法。
修改后的完整代码
写法一:保留原链式结构补全逻辑
public function scopeAvailable(Builder $query, bool $condition1, bool $condition2) { return $query ->when($condition1, fn ($query) => $query->where('sum', '>', 10)) ->when($condition2, fn ($query) => $query->where('avg', '<', 100)) ->when(!$condition1 && !$condition2, fn ($query) => $query->whereRaw('1=0')); }
写法二:提前判断双假情况,逻辑更直观
public function scopeAvailable(Builder $query, bool $condition1, bool $condition2) { if (!$condition1 && !$condition2) { return $query->whereRaw('1=0'); } return $query ->when($condition1, fn ($query) => $query->where('sum', '>', 10)) ->when($condition2, fn ($query) => $query->where('avg', '<', 100)); }
说明
whereRaw('1=0')会生成WHERE 1=0的SQL语句,数据库会直接返回空结果,性能开销极小。- 写法二通过提前判断双假情况,减少了链式调用层级,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Max Trunnikov
相关产品推荐
相关产品推荐

