优美的集合:计数和检测空

351

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

我们目前使用!$result来检测空结果,这足够了吗?对于count($result),它是否实际覆盖所有情况,包括空结果?

13个回答

722

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

注释/参考文献

额外信息

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


5
谢谢,只是想补充一下,如果你运行查询first(),结果与get()不同,可以通过!$result进行检查,因为空结果是null - bitinn
2
@btinn 是的 - 如果您执行了 i.e. Model::first() - 它实际上是在查询构建器的 'first方法上操作而不是集合,因此它将从数据库中获取第一个:但是Model::get()将返回 Illuminate\Support\Collection 的实例,因此如果您执行了$r = Model::get()然后$r->first()` 它将从该集合中挑选出第一项。 - Gary Green
这个答案没有涉及到的一件事是 count($result) 是否有效;加上这个细节会更好。 - Mark Amery
$result->count和count($result)有什么区别?$result->count会再次访问数据库吗?如果不是,那么我猜它们就是一样的! - Kamy D
2
@pathros 没有简单的方法可以做到这一点。您需要使用 foreach 循环迭代集合中的每个成员,然后使用其中一个检查(考虑:count($collection->column))。 - PapaHotelPapa
显示剩余6条评论

99

我想你正在寻找:

$result->isEmpty()

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


1
当您只想检查特定列(属性)是否为空/ null时,可以使用$collection->column。 - Pathros

20

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

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

有时候我们会忘记在 if(!results->isEmpty()) 前面加上 '!',这可能导致意外的错误,因此它比这个更冗长。

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


17

Laravel提供了几种检查结果数量/检查空值/非空值的方法:

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

11

根据 Laravel 文档所述,您可以使用以下方法:

$result->isEmpty();

isEmpty 方法在集合为空时返回 true;否则,返回 false


9

我认为最好使用

$result->isEmpty();

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

7

我认为你可以尝试类似于以下的方法:

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

或者也可以使用

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

5
您可以做的是:
$result = Model::where(...)->count(); 

计算结果。

您也可以使用

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

检查结果是否为空。


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

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接