Eloquent 选择具有空字符串或空值的行

问题描述 投票:0回答:6

我有类似

$user->albums()->where('col', NULL)
的东西,它工作正常,然后我尝试使用
$user->albums()->where('col', NULL)->or_where('col', '')
将其扩展到空字符串,但它不起作用。

我还看到在这篇文章中我可以使用

where_null('col')
但它不起作用并且它没有记录。选择空或 NULL col 的任何简单方法

php laravel eloquent orm relationship
6个回答
66
投票

尝试使用

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();



3
投票

这个怎么样:

$user->albums()->whereRaw("NOT col > ''")

这样您可以同时检查这两个条件


2
投票

尝试这个查询:

$users = DB::table('users')
        ->whereRaw('col = "" OR col IS NULL')
        ->get();

1
投票

我总是鼓励使用最常用的主要 Laravel 函数创建查询。 这就是为什么你必须记住两件事:

  • 算法。 key1 = value1 AND key2 = value2 或 key3 = value3。要非常小心优先级,因为按照我举例的方式,将有一个主要的 OR,而不是里面有 OR 的 AND
  • 使用 where()、whereIn()、whereNull 和闭包代替 whereRaw()。 whereRaw 使用的内存比我提到的任何其他内存都多。

所以,继续你的回答:

或条件

$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();

1
投票

以下解决方案是在 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 = '')

-5
投票

不确定,但这可能有用:

$user->albums()->whereIn('col', [null,'']);
© www.soinside.com 2019 - 2024. All rights reserved.