laravel - Laravel 不等于不按预期工作
问题描述
我已经做了一些搜索,但找不到答案,所以非常感谢一些帮助。
我正在运行以下雄辩的陈述:
$collection= Table1::select('table1.*','table2.finish_status_id')
->join('table2','table2.id','=','table1.table2_id')
->where('table1.id',$id)
->where('finish_status_id','=',6)
->paginate(25);
此查询有效。
但是,我真正想要的是: ->where('finish_status_id','!=',6)
这不起作用,我没有得到任何结果。
以下这些查询变体都按预期工作
->where('finish_status_id','=',6)
->where('finish_status_id','=',null)
->where('finish_status_id','!=',null)
->where('finish_status_id','<>',null)
如果我没有看到为什么 != 不起作用的原因?
更新: 根据 ThataL 的建议,我尝试用 SQL 编写查询以使其正常工作。我无法得到我最初计划的内容,经过一番挖掘发现这个线程: SQL is null and = null
答案表明 NULL 不等于 SQL 中的“null”。因此,它被视为未知,而不是用“null”值填充的值。
使用我的 != 6 短语,我也期望收到所有空值。但是,经过进一步检查,该查询有效,但它也不返回空记录。
进一步搜索后,我发现了我要在这个线程上寻找的内容:Laravel 4 Eloquent Query Using WHERE with OR AND OR?
最初,简单地添加一个 'whereNull('finish_Status_id')' 是行不通的,因为作为一个或,它基本上忽略了我之前的 where 子句。(即,它得到所有为空的东西,或者,所有带有 $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);
这为我提供了我所追求的解决方案。
解决方案
这是将 null 包含到查询中的正确代码。
$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);