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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:02:07