Eloquent 集合:计数和检测空

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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)  ... 

注释/参考文献

->first() http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_first isEmpty() http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_isEmpty ->count() http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_count count($result) 之所以有效,是因为 Collection 实现了 Countable 和一个内部 count() 方法:http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_count

奖金信息

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

Laravel 5.2 Collection Class Laravel 5.2 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);
    

【讨论】:

以上是关于Eloquent 集合:计数和检测空的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 一对一关系返回空集合

Laravel Eloquent 在 belongsToMany 关系上返回一个空集合

修改 Eloquent 查询以使其始终返回空集合的最有效方法是啥?

如何在 Laravel 4 中手动创建一个新的空 Eloquent 集合

从 Eloquent 集合中删除不匹配的条件记录

Laravel Eloquent 加入表和计数相关