Laravel Eloquent where不等于查询未返回预期结果的解决办法
原因说明
SQL 采用三值逻辑规则,NULL 代表未知值,使用常规比较运算符(=、!=、<> 等)将 NULL 与任意具体值比较时,返回的结果既不是 TRUE 也不是 FALSE,而是 UNKNOWN,只有返回 TRUE 的记录才会被查询条件命中。
当你使用 where('finish_status_id','!=',6) 时,所有 finish_status_id 为 NULL 的记录都会因为比较结果为 UNKNOWN 被过滤,所以无法拿到你预期的结果。
你之前测试的 where('finish_status_id','!=',null) 可以正常生效,是因为 Laravel 查询构造器底层做了兼容处理,自动将和 NULL 相关的比较转换为 IS NOT NULL 语句,和直接用 != 判断具体数值的逻辑完全不同。
解决方案
你最终使用的闭包分组条件就是标准的正确实现:将「值不等于 6」和「值为 NULL」两个条件用 OR 逻辑封装在同一个分组里,既不会和外层的 table1.id = $id 条件冲突,也能覆盖所有符合要求的记录:
$collection= Table1::select('table1.*','table2.finish_status_id') ->join('table2','table2.id','=','table1.table2_id') ->where('table1.id',$id) ->where(function ($query) { $query->where('finish_status_id', '!=', 6) ->orWhereNull('finish_status_id'); }) ->paginate(25);
如果你使用 Laravel 9 及以上版本,还可以用更简洁的 whereNot 方法实现完全等价的效果,Laravel 会自动处理 NULL 值的匹配逻辑:
->whereNot('finish_status_id', 6)
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

