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


272

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

我们目前正在使用!$result以检测空结果,是否足够?至于count($result),它实际上涵盖所有情况,包括空结果吗?

Answers:


580

使用时,->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的差异可能会有些混乱,因为两者之间的方法名称通常是相同的。因此,知道您正在从事的工作可能会令人困惑。在您调用一个将在其中执行查询并访问数据库的方法之前,查询生成器实质上会构建查询(例如,当您调用诸如->all() ->first() ->lists()和其他方法之类的某些方法时)。这些方法存在于Collection对象上,如果有多个结果,则可以从查询生成器中返回这些方法。如果不确定实际使用的是哪个类,请尝试进行var_dump(User::all())尝试以查看其实际返回的类(在get_class(...))。我强烈建议您查看Collection类的源代码,这很简单。然后检出查询生成器,查看函数名称的相似之处,并找出它实际何时到达数据库。


4
thx,只是要补充一点,如果您运行query first(),结果不同于get(),可以检查!$result为空,结果为null
bitinn 2013年

2
@btinn是的-如果您这样做的话Model::first()-它实际上是在查询生成器的“第一个”方法而不是集合上起作用,因此它将从数据库中选择第一个方法-但是Model::get()将返回Illuminate \ Support的实例\ Collection,所以如果您这样做了$r = Model::get()$r->first()它将选择该集合中的第一项。
加里·格林

这个答案不能解决的一件事是是否count($result)有效。添加该细节将是一个改进。
Mark Amery 2015年

$ result-> count和count($ result)有什么区别$ result-> count会再次命中数据库吗?如果没有,我想这些是一样的!
Kamy D

2
@pathros没有做到这一点的简单方法。您将不得不使用循环遍历集合的每个成员,foreach然后使用这些检查之一(请考虑:)count($collection->column)
PapaHotelPapa

70

我认为您正在寻找:

$result->isEmpty()

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


1
当您只想检查$ collection-> column中的特定列(属性)为空/空时,该怎么办?
Pathros 16-3-26

13

我同意以上批准的答案。但是通常我使用$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.


3

我想你尝试像

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

或也使用

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

2

你可以做

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

计算结果。

您也可以使用

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

检查结果是否为空。



0

因此,Laravel实际上在Model::all(); 不使用集合就需要数组时会返回一个集合,因此您可以键入set。 (array)Model::all();然后您可以使用array_filter返回结果

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

这也可以让你做类似的事情count()


3
将其保留为一个集合实际上很方便,因此返回的对象仍可以在集合外观中继承许多有用的功能。
Gokigooooks '16

0

- - - 解决了 - - -

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

情况1:

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

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

情况2:

如果结果包含一组多行其他单词,则使用-> get()或-> all()

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.