我有类似
$user->albums()->where('col', NULL)
的东西,它工作正常,然后我尝试使用 $user->albums()->where('col', NULL)->or_where('col', '')
将其扩展到空字符串,但它不起作用。
我还看到在这篇文章中我可以使用
where_null('col')
但它不起作用并且它没有记录。选择空或 NULL col 的任何简单方法
orWhereNull
作为第二个子句:
$users = DB::table('users')
->where('col', '=', '')
->orWhereNull('col')
->get();
或者,如果查询中有多个条件,则必须将两个条件包装在闭包中:
$users = DB::table('users')
->where(function(\Illuminate\Database\Eloquent\Builder $query) {
$query->where('col', '')->orWhereNull('col');
})
->where('col2','val2')
->get();
这个怎么样:
$user->albums()->whereRaw("NOT col > ''")
这样您可以同时检查这两个条件
尝试这个查询:
$users = DB::table('users')
->whereRaw('col = "" OR col IS NULL')
->get();
我总是鼓励使用最常用的主要 Laravel 函数创建查询。 这就是为什么你必须记住两件事:
所以,继续你的回答:
或条件
$users = DB::table('users')
->where('col', '=', '')
->orWhere('col','=','')
->whereNull('col')
->get();
AND 和 OR 条件
$users = DB::table('users')
->where(function($query) { $query->where('col','=','')->orWhere('col','=','')->whereNull('col'); })
->where('col','=','')
->get();
以下解决方案是在 LARAVEL 9 上测试的。解决方案是在 App\Providers\AppServiceProvider 中添加这段代码:
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
///...
Builder::macro('whereNullOrEmpty', function ($field) {
return $this->where(function ($query) use ($field) {
return $query->where($field, '=', null)->orWhere($field, '=', '');
});
});
Builder::macro('whereNotNullOrEmpty', function ($field) {
return $this->where(function ($query) use ($field) {
return $query->where($field, '<>', null)->where($field, '<>', '');
});
});
}
//...
}
然后这样称呼它:
if($nullOrEmpty){
$builder->whereNullOrEmpty('col');
}else{
$builder->whereNotNullOrEmpty('col');
}
您必须调用这两个命令:
where($field, '<>', null);
where($field, '<>', '');
因为 MySql 处理空字符串和 null 的方式与 PHP 不同
您还需要用闭包包装这两个命令,以告诉 Eloquent 将生成的代码放在括号中并隔离 MySql 代码:
(where col = null or where col = '')
不确定,但这可能有用:
$user->albums()->whereIn('col', [null,'']);