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 并查看函数名称的相似之处,并找出它何时真正命中数据库。
【讨论】:
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 在 belongsToMany 关系上返回一个空集合
修改 Eloquent 查询以使其始终返回空集合的最有效方法是啥?