【问题标题】:How do you check "if not null" with Eloquent?你如何用 Eloquent 检查“如果不为空”?
【发布时间】:2014-02-12 10:14:38
【问题描述】:

你如何用 Eloquent 检查一个字段是否不为空

我尝试了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

【问题讨论】:

  • 你可以尝试使用!=而不是IS NOT。
  • @JaTochNietDan != 运算符不适用于 NULL 值。根据MySQL Documentation:“您不能使用算术比较运算符,例如 =、 来测试 NULL。”

标签: laravel eloquent


【解决方案1】:

Eloquent 有一个方法(Laravel 4.*/5.*);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')

【讨论】:

  • 我需要检查已删除字段的空值,因此我将其更改为 whereNull('deleted_at') 并运行查询。
  • 另一个undocumented 功能。好吧,除非你算上 API 文档,但 Laravel 的主要文档并没有提到它。
  • whereNotNull() 方法(以及之前未记录的其他几个方法)已添加到 5.1 版的文档中:laravel.com/docs/5.1/queries#where-clauses
  • @aross 但在查询生成器中,而不是在 Eloquent (Laravel 5.1) 中
  • @pmiranda 不确定你的意思,但我的评论是 4 年前关于 Laravel 4 的,现在我们在 Laravel 6 上。我想情况发生了变化。虽然 Laravel 的主要文档还不是很完整,但感觉更像是一堆指南。
【解决方案2】:

如果要搜索已删除记录(Soft Deleted Record),请不要使用 Eloquent Model Query。 而是使用 Db::table 查询 例如 而不是使用下面:

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

用途:

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

【讨论】:

  • 这个答案与问题无关。除此之外,您不需要使用Db::table 来查找软删除记录。您可以使用 withTrashed() 方法过滤它们,就像文档中所说的那样:laravel.com/docs/5.3/eloquent
  • 这个答案与要求的问题无关。
【解决方案3】:

如果像我这样的人想在 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', '<>', '');
}

【讨论】:

  • 'and' 代表什么?
  • 实际上这里的'and'什么都不做,但如果第一个参数是一个数组,它会做。这是方法原型:public function where($column, $operator = null, $value = null, $boolean = 'and'); and location - ".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
【解决方案4】:

laravel 5.4 中,此代码 Model::whereNotNull('column') 不起作用,您需要添加 get() 喜欢这个 Model::whereNotNull('column')-&gt;get(); 这个代码对我来说很好。

【讨论】:

    【解决方案5】:

    如果你想使用DB facade

    DB::table('table_name')-&gt;whereNotNull('sent_at')-&gt;get();

    【讨论】:

      【解决方案6】:

      我们可以使用

      Model::whereNotNull('sent_at');
      

      或者

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

      【讨论】:

        【解决方案7】:

        我看到这个问题有点老了,但我跑过去寻找答案。虽然我在这里的答案没有成功,但我认为这可能是因为我使用的是 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 而不是数组。

        【讨论】:

          【解决方案8】:

          您也可以使用原始查询。

          记住:报告是我的模型,我使用 where raw,原始查询的最佳之处在于您可以使用多种类型的运算符,例如 AND、OR 等,只需将其作为字符串。

          例如:WHERE 条件1 AND 条件2 AND 条件3 ...;


          Reports::whereRaw("column1 IS NOT NULL AND column2 IS NOT NULL");
          

          上面的查询将被执行为:

          从列不为空且列 2 不为空的报告中选择 *。

          要进一步了解 IS NullIS not null 运算符:

          https://www.w3schools.com/sql/sql_and_or.asp

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-09-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-06
            • 2017-01-26
            • 2012-06-17
            相关资源
            最近更新 更多