您如何用Eloquent检查“ if not null”?


218

您如何使用Eloquent 检查字段是否不为null

我试过了,Model::where('sent_at', 'IS NOT', DB::raw('null'))->...但它给出的IS NOT是绑定而不是比较。

就是这样DB::getQueryLog()说的:

  'query' => string 'select * from my_table where sent_at = ? and profile_id in (?, ?) order by created_at desc' (length=101)
  'bindings' => 
    array (size=3)
      0 => string 'IS NOT' (length=6)
      1 => int 1
      2 => int 4

您可以尝试使用!=而不是不是。
JaTochNietDan 2014年

1
@JaTochNietDan!=运算符不适用于NULL值。根据MySQL文档:“您不能使用算术比较运算符(例如=,<或<>)测试NULL。”
Soulriser

Answers:


402

雄辩的有一种方法(Laravel 4。* / 5. *);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')

1
我需要检查已删除字段的空值,因此将其更改为, whereNull('deleted_at')然后运行查询。
塔伦2015年

7
另一个未记录的功能。好吧,除非您计算API文档,但是Laravel的主要文档没有提及它。
2015年

12
whereNotNull()方法(以及以前未记录的其他几种方法)已添加到5.1版的文档中:laravel.com/docs/5.1/queries#where-clauses
本·约翰逊

@aross,但在查询生成器中,而不是在口才(Laravel 5.1)中
pmiranda

@pmiranda不确定您的意思,但我的评论是4年前关于Laravel 4的事,如今我们在Laravel6。我想情况发生了变化。尽管Laravel的主要文档仍然不够完善,但感觉像是一堆指南。
aross

20

如果像我这样的人想使用Laravel 5.2.23中的查询生成器来完成此操作,则可以像->

 $searchResultQuery = Users::query(); 
 $searchResultQuery->where('status_message', '<>', '', 'and'); // is not null
 $searchResultQuery->where('is_deleted', 'IS NULL', null, 'and'); // is null 

或在模型范围内:

public function scopeNotNullOnly($query){

    return $query->where('status_message', '<>', '');
}

1
哪些呢'and'主张?
sendy

1
实际上,这里的“和”不执行任何操作,但如果第一个参数为数组,它将执行操作。这是方法的原型:public function where($column, $operator = null, $value = null, $boolean = 'and'); 和位置".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
Atiqur's


4

我们可以用

Model::whereNotNull('sent_at');

要么

Model::whereRaw('sent_at is not null');

4

我看到这个问题有点老了,但我碰到了它寻找答案。尽管我的答案没有成功,但我认为这可能是因为我使用的是PHP 7.2Laravel 5.7。可能是因为我只是使用Laravel Tinker在CLI上处理一些数据。

我尝试了一些对我有用的东西,而对我却没有希望,希望对其他人有所帮助。


我没有运行成功:

    MyModel::whereNotNull('deleted_by')->get()->all();             // []
    MyModel::where('deleted_by', '<>', null)->get()->all();        // []
    MyModel::where('deleted_by', '!=', null)->get()->all();        // []
    MyModel::where('deleted_by', '<>', '', 'and')->get()->all();   // []
    MyModel::where('deleted_by', '<>', null, 'and')->get()->all(); // []
    MyModel::where('deleted_by', 'IS NOT', null)->get()->all();    // []

以上所有都为我返回了一个空数组


但是我确实运行成功:

    DB::table('my_models')->whereNotNull('deleted_by')->get()->all(); // [ ... ]

如我所料,这将所有结果返回到数组中。注意:如果愿意,可以删除all()并取回Illuminate \ Database \ Eloquent \ Collection而不是数组。


0

laravel 5.4中,此代码Model::whereNotNull('column')无法正常工作,您需要添加get()这样的代码,此代码Model::whereNotNull('column')->get();对我来说效果很好。


-11

如果要搜索已删除的记录(“软已删除的记录”),请不要使用Eloquent Model Query。而是使用Db :: table查询,例如,而不是使用下方:

$stu = Student::where('rollNum', '=', $rollNum . '-' . $nursery)->first();

用:

$stu = DB::table('students')->where('rollNum', '=', $newRollNo)->first();

这个答案与问题无关。除此之外,您无需使用Db::table来查找软删除的记录。您可以使用方法过滤它们withTrashed(),如docs中所述:laravel.com/docs/5.3/eloquent
gvsrepins
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.