雄辩的收集:计数和检测空
这可能是一个微不足道的问题,但我想知道如果Laravelbuild议以某种方式来检查从$result = Model::where(...)->get()
返回的Eloquent集合是否为空,以及计数元素。
我们目前正在使用!$result
来检测空的结果,是否足够? 至于count($result)
,它实际上是否覆盖所有的情况,包括空的结果?
当使用->get()
,不能简单地使用下面的任何一个:
if (empty($result)) { } if (!$result) { } if ($result) { }
因为如果你dd($result);
你会注意到一个Illuminate\Support\Collection
实例总是被返回,即使没有结果。 基本上你正在检查的是$a = new stdClass; if ($a) { ... }
$a = new stdClass; if ($a) { ... }
将始终返回true。
要确定是否有任何结果,您可以执行以下任一操作:
if ($result->first()) { } if (!$result->isEmpty()) { } if ($result->count()) { } if (count($result)) { }
您也可以在查询构build器上使用->first()
而不是->get()
来返回第一个find的模型的实例,否则返回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的新手感到困惑,因为这两个方法名称往往是相同的。 出于这个原因,知道你在做什么可能会让人困惑。 查询生成器本质上是build立一个查询,直到你调用一个方法来执行查询和命中数据库(例如当你调用诸如->all()
->first()
->lists()
等)的方法。 这些方法也存在于Collection
对象上,如果有多个结果,可以从Query Builder返回。 如果您不确定实际使用的是哪个类,请尝试执行var_dump(User::all())
并尝试查看实际返回的类(在get_class(...)
帮助下)。 我强烈build议你查看Collection类的源代码,这很简单。 然后检查查询生成器并查看函数名称中的相似性,并确定它何时实际访问数据库。
- Laravel 5.2集合类
- Laravel 5.2查询生成器
我想你正在寻找:
$result->isEmpty()
这与empty($result)
,因为结果将是一个空集合,所以这不是真的。 count($result)
build议也是一个很好的解决scheme。 我无法在文档中find任何参考
我同意以上批准的答案。 但通常我使用$results->isNotEmpty()
方法,如下所示。
if($results->isNotEmpty()) { //do something }
这比if(!results->isEmpty())
更冗长,因为有时我们忘记添加'!' 在前面可能会导致不必要的错误。
所以当使用Model::all();
时,Laravel实际上返回一个集合Model::all();
你不想要一个你想要一个数组的集合,所以你可以键入设置它。 (array)Model::all();
那么你可以使用array_filter来返回结果
$models = (array)Model::all() $models = array_filter($models); if(empty($models)) { do something }
这也将允许你做count()
这样的事情。