Laravel中whereNull与where组合查询无返回结果的异常问题
问题原因及解决方案
你遇到的问题核心在于SQL对NULL值的比较逻辑:当使用!= 'failed'时,SQL会自动排除status字段为NULL的记录——因为任何和NULL的比较运算结果都是NULL(逻辑上视为false),哪怕这些记录原本符合whereNull('completed_at')的条件。你以为符合条件的2条数据,大概率是status字段为NULL的记录,所以被where('status', '!=', 'failed')过滤掉了。
解决方法
需要把status为NULL的情况也包含进来,有两种常用写法:
方法一:用闭包组合条件
$user ->shoePurchases() ->whereNull('completed_at') ->where(function($query) { $query->where('status', '!=', 'failed') ->orWhereNull('status'); }) ->get();
方法二:用原生SQL语句
$user ->shoePurchases() ->whereNull('completed_at') ->whereRaw("status != 'failed' OR status IS NULL") ->get();
验证建议
可以先单独查询目标数据的status值,确认是否为NULL:
$user->shoePurchases()->whereNull('completed_at')->select('id', 'status')->get();
内容的提问来源于stack exchange,提问作者BigJobbies
相关产品推荐
相关产品推荐

