这可能是一个微不足道的问题,但我想知道Laravel是否推荐了一种特定的方法来检查$result = Model::where(...)->get()返回的Eloquent集合是否为空,以及计算元素的数量。
$result = Model::where(...)->get()
我们目前正在使用!$result来检测空结果,这足够了吗?至于count($result),它实际上是否涵盖所有情况,包括空结果?
!$result
count($result)
我想你正在寻找:
$result->isEmpty()
这与empty($result)不同,后者不会为真,因为结果将是一个空集合。你对count($result)的建议也是一个很好的解决方案。我在文件里找不到任何参考资料
empty($result)
当使用->get()时,你不能简单地使用以下任何一个:
->get()
if (empty($result)) { } if (!$result) { } if ($result) { }
因为如果你dd($result);,你会注意到Illuminate\Support\Collection的实例总是返回,即使没有结果。本质上你检查的是$a = new stdClass; if ($a) { ... },它总是返回true。
dd($result);
Illuminate\Support\Collection
$a = new stdClass; if ($a) { ... }
要确定是否有任何结果,您可以执行以下任何操作:
if ($result->first()) { } if (!$result->isEmpty()) { } if ($result->count()) { } if (count($result)) { }
你也可以在查询构建器上使用->first()而不是->get(),后者将返回第一个找到的模型的实例,或者使用null。如果您只需要或期望从数据库中得到一个结果,这是非常有用的。
->first()
null
$result = Model::where(...)->first(); if ($result) { ... }
备注/参考资料
isEmpty()
->count()
count()
对于刚接触Laravel的人来说,Collection和Query Builder的区别可能有点令人困惑,因为两者的方法名通常是相同的。由于这个原因,知道自己在做什么可能会让人困惑。查询生成器实际上是构建一个查询,直到你调用一个方法,它将执行查询并命中数据库(例如,当你调用某些方法,如->all() ->first() ->lists()和其他)。这些方法也存在于Collection对象中,如果有多个结果,可以从查询生成器中返回。如果你不确定你实际处理的是什么类,试着做var_dump(User::all()),看看它实际返回的是什么类(在get_class(...)的帮助下)。我强烈建议您查看Collection类的源代码,它非常简单。然后检查Query Builder,查看函数名称的相似性,并找出它何时真正访问数据库。
->all()
->lists()
Collection
var_dump(User::all())
get_class(...)
,所以Laravel实际上在使用Model::all();时返回一个集合 你不想要一个集合,你想要一个数组,所以你可以类型设置它。 (array)Model::all();,然后你可以使用array_filter返回结果
Model::all();
(array)Model::all();
$models = (array)Model::all() $models = array_filter($models); if(empty($models)) { do something }
这也将允许你做类似count()的事情。
我同意以上认可的答案。但通常我使用$results->isNotEmpty()方法,如下所示。
$results->isNotEmpty()
if($results->isNotEmpty()) { //do something }
它比if(!results->isEmpty())更啰嗦,因为有时我们会忘记添加'!',这可能会导致不必要的错误。
if(!results->isEmpty())
注意,这个方法从版本5.3开始存在。
Laravel中给出了几种检查结果计数/检查空/不空的方法:
$result->isNotEmpty(); // True if result is not empty. $result->isEmpty(); // True if result is empty. $result->count(); // Return count of records in result.
你想检查count()的这两种情况。
# 1
如果结果只包含来自数据库的单行(一条记录),则使用->first()。
if(count($result)) { // record is exist true... }
#2
如果结果包含多行(多条记录),则使用->get()或->all()。
if($result->count()) { //record is exist true... }
你可以这样做
$result = Model::where(...)->count();
计算结果。
你也可以使用
if ($result->isEmpty()){}
检查结果是否为空。
我觉得你可以试试
@if(!$result->isEmpty()) // $result is not empty @else // $result is empty @endif
或者也可以用
if (!$result) { } if ($result) { }
我觉得还是用旧的比较好
$result->isEmpty();
如果集合为空,isEmpty方法返回true;否则, .返回False
根据Laravel 文档声明,你可以这样使用:
如果集合为空,isEmpty方法返回true;否则返回false。
isEmpty
true
false
你可以使用: $counter = count($datas);
$counter = count($datas);
in_array()检查数组中是否存在一个值。
in_array()
public function isAbsolutelyEmpty($value) { return in_array($value, ["", "0", null, 0, 0.0], true); }