【问题标题】:Eloquent Collection: Counting and Detect EmptyEloquent 集合:计数和检测空
【发布时间】:2014-01-01 00:35:54
【问题描述】:

这可能是一个微不足道的问题,但我想知道 Laravel 是否推荐某种方式来检查从 $result = Model::where(...)->get() 返回的 Eloquent 集合是否为空,以及计算元素的数量。

我们目前正在使用!$result 来检测空结果,这是否足够?至于count($result),是不是真的涵盖了所有情况,包括空结果?

【问题讨论】:

    标签: laravel laravel-4 eloquent laravel-collection


    【解决方案1】:

    使用->get() 时,您不能简单地使用以下任何一种:

    if (empty($result)) { }
    if (!$result) { }
    if ($result) { }
    

    因为如果您使用dd($result);,您会注意到始终返回Illuminate\Support\Collection 的实例,即使没有结果也是如此。本质上,您要检查的是 $a = new stdClass; if ($a) { ... },它将始终返回 true。

    要确定是否有任何结果,您可以执行以下任一操作:

    if ($result->first()) { } 
    if (!$result->isEmpty()) { }
    if ($result->count()) { }
    if (count($result)) { }
    

    您也可以在查询生成器上使用->first() 代替->get(),这将返回第一个找到的模型的实例,否则使用null。如果您需要或只期望数据库中的一个结果,这将非常有用。

    $result = Model::where(...)->first();
    if ($result) { ... }
    

    注释/参考文献

    奖金信息

    Collection 和 Query Builder 的区别对于 Laravel 的新手来说可能会有些混乱,因为两者之间的方法名称通常相同。出于这个原因,知道你在做什么可能会让人困惑。查询构建器本质上是构建一个查询,直到您调用一个方法,它将执行查询并访问数据库(例如,当您调用某些方法时,如->all()->first()->lists() 等)。这些方法存在于Collection 对象上,如果有多个结果,则可以从查询生成器返回。如果您不确定您实际使用的是什么类,请尝试执行var_dump(User::all()) 并尝试查看它实际返回的类(在get_class(...) 的帮助下)。我强烈建议您查看 Collection 类的源代码,它非常简单。然后查看 Query Builder 并查看函数名称的相似之处,并找出它何时真正命中数据库。

    【讨论】:

    • thx,只是补充一点,如果你运行查询first(),结果与get()不同,可以用!$result检查,因为空结果是null
    • @btinn 是的——如果你这样做了,即Model::first()——它实际上作用于查询构建器的“第一个”方法而不是集合,因此它将从数据库中选择第一个-- 但是Model::get() 将返回一个 Illuminate\Support\Collection 的实例,因此如果您执行了$r = Model::get() 然后$r->first() 它将选择该集合中的第一个项目。
    • 这个答案没有解决的一件事是count($result) 是否有效;添加该细节将是一种改进。
    • $result->count 和 count($result) 有什么区别 $result->count 又打数据库了吗?如果不是,我想这些都是一样的!
    • @pathros 没有简单的方法可以做到这一点。您必须使用 foreach 循环遍历集合的每个成员,然后使用其中一项检查(想想:count($collection->column))。
    【解决方案2】:

    我想你正在寻找:

    $result->isEmpty()
    

    这与empty($result) 不同,后者不成立,因为结果将是一个空集合。您对count($result) 的建议也是一个很好的解决方案。我在文档中找不到任何参考

    【讨论】:

    • 当您只想检查 $collection->column 中的特定列(属性)是否为空/null 时怎么样?
    【解决方案3】:

    我同意上述批准的答案。但通常我使用$results->isNotEmpty() 方法,如下所示。

    if($results->isNotEmpty())
    {
    //do something
    }
    

    它比if(!results->isEmpty()) 更冗长,因为有时我们忘记添加“!”前面可能会导致不必要的错误。

    请注意,此方法从版本 5.3 开始存在。

    【讨论】:

      【解决方案4】:

      Laravel 中给出了几种检查结果计数/检查为空/不为空的方法:

      $result->isNotEmpty(); // True if result is not empty.
      $result->isEmpty(); // True if result is empty.
      $result->count(); // Return count of records in result.
      

      【讨论】:

        【解决方案5】:

        我觉得更好用

        $result->isEmpty();
        

        如果集合为空,isEmpty 方法返回 true;否则, 返回 false。

        【讨论】:

          【解决方案6】:

          我想你可以试试

            @if(!$result->isEmpty())
                   // $result is not empty
              @else
                  // $result is empty
              @endif
          

          也可以使用

          if (!$result) { }
          if ($result) { } 
          

          【讨论】:

            【解决方案7】:

            你可以的

            $result = Model::where(...)->count(); 
            

            计算结果。

            你也可以使用

            if ($result->isEmpty()){}
            

            检查结果是否为空。

            【讨论】:

              【解决方案8】:

              根据 Laravel Documentation 的说法,您可以这样使用:

              $result->isEmpty();
              

              如果集合为空,isEmpty 方法返回true;否则返回false

              【讨论】:

                【解决方案9】:

                您可以使用: $counter = count($datas);

                【讨论】:

                  【解决方案10】:

                  所以 Laravel 在使用 Model::all(); 时实际上会返回一个集合 你不想要一个集合,你想要一个数组,所以你可以键入设置它。 (array)Model::all(); 然后可以使用array_filter 来返回结果

                  $models = (array)Model::all()
                  $models = array_filter($models);
                  if(empty($models))
                  {
                   do something
                  }
                  

                  这还允许您执行count() 之类的操作。

                  【讨论】:

                  • 将它作为一个集合保存实际上很方便,这样返回的对象仍然可以继承集合门面中的许多有用功能。
                  【解决方案11】:

                  -----已解决------

                  在这种情况下,您要检查两个 cace 的两种类型的计数

                  案例 1:

                  如果结果只包含一条记录,其他单词使用 ->first() 从数据库中选择单行

                   if(count($result)){
                       
                         ...record is exist true...
                    }
                  

                  案例 2:

                  如果结果包含一组多行或者使用 ->get() 或 ->all()

                    if($result->count()) {
                      
                           ...record is exist true...
                    }
                  

                  【讨论】:

                    【解决方案12】:

                    这个自定义函数可以工作

                        public function isAbsolutelyEmpty($value){
                           return in_array($value, ["", "0", null, 0, 0.0], true);
                        }
                    

                    【讨论】:

                      猜你喜欢
                      • 2019-01-15
                      • 2020-05-22
                      • 1970-01-01
                      • 2014-05-29
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-09-09
                      • 1970-01-01
                      • 2018-09-06
                      相关资源
                      最近更新 更多