Laravel中如何查询字段为FALSE或NULL的条目?现有代码不生效
在Laravel中查询字段为FALSE或NULL的正确姿势
你遇到的问题大概率是orWhere的逻辑优先级导致的——如果你的查询还有其他条件,orWhere会直接和前面的条件做“或”运算,破坏你原本的查询逻辑。举个例子,要是你之前还有个where('status', 1),原代码会被解析成status=1 AND invisible=false OR invisible=null,这显然不是你想要的结果,正确逻辑应该是status=1 AND (invisible=false OR invisible=null)。
下面给你几种靠谱的解决办法:
方法一:用闭包包住OR条件(推荐)
把需要“或”的两个条件放到一个闭包里,既能保证逻辑优先级正确,也方便和其他查询条件组合:
return $this->model->where(function ($query) { $query->where('invisible', false) ->orWhereNull('invisible'); })->get(); // 这里可以换成你需要的查询方法,比如first()、paginate()等
方法二:直接用whereRaw写原生SQL
如果喜欢更直接的写法,也可以用whereRaw写原生SQL条件,逻辑一目了然:
return $this->model->whereRaw('invisible = FALSE OR invisible IS NULL')->get();
方法三:定义查询作用域(复用性更高)
要是你经常需要做这个查询,不如给模型加个查询作用域,以后用起来更省心:
在你的模型里添加:
public function scopeVisible($query) { return $query->where(function ($q) { $q->where('invisible', false)->orWhereNull('invisible'); }); }
之后调用时就能简化成:
return $this->model->visible()->get();
小提示:如果你的invisible字段在数据库里是tinyint(1)类型(Laravel默认的布尔字段类型),false会被自动转换成0,所以用where('invisible', 0)也能生效,但用false语义更清晰。
内容的提问来源于stack exchange,提问作者morne
相关产品推荐
相关产品推荐

