雄辩的收集:计数和检测空

问题描述 投票:210回答:10

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

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

laravel laravel-4 eloquent laravel-collection
10个回答
508
投票

使用->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) { ... }

备注/参考

Bonus Information

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


0
投票

据Laravel Documentation说,你可以这样使用:

$result->isEmpty();

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


62
投票

我想你正在寻找:

$result->isEmpty()

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


9
投票

我同意上述批准的答案。但通常我使用下面给出的$results->isNotEmpty()方法。

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

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

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


2
投票

Laravel中提供了几种方法来检查结果计数/检查空/非空:

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

2
投票

我想你尝试过类似的东西

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

或者也使用

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

2
投票

我认为更好用

$result->isEmpty();

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


1
投票

你可以做

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

计算结果。

你也可以使用

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

检查结果是否为空。


0
投票

因此,当使用Model::all();时,Laravel实际上会返回一个集合,你不想要一个你想要一个数组的集合,所以你可以输入它。 (array)Model::all();然后你可以使用array_filter返回结果

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

这也可以让你做像count()这样的事情。


0
投票

- - - 解决了 - - -

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

情况1:

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

 if(count($result)){

       ...record is exist true...
  }

案例2:

如果结果包含多行其他单词的集合使用 - > get()或 - > all()

  if($result->count()) {

         ...record is exist true...
  }
© www.soinside.com 2019 - 2024. All rights reserved.