这可能是一个琐碎的问题,但我想知道Laravel是否推荐一种特定的方式来检查从$result = Model::where(...)->get()
返回的Eloquent集合是否为空,并计算元素数量。
我们目前使用!$result
来检测空结果,这足够了吗?对于count($result)
,它是否实际覆盖所有情况,包括空结果?
这可能是一个琐碎的问题,但我想知道Laravel是否推荐一种特定的方式来检查从$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) { ... }
,这将始终返回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_firstisEmpty()
:判断集合是否为空。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_countcount($result)
之所以有效,是因为集合实现了Countable接口,并拥有内部的count()
方法:http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_countLaravel的Collection和Query Builder的区别可能会对Laravel新手造成困惑,因为两者的方法名通常是相同的。由此很难知道你正在处理哪一个对象。Query Builder本质上是构建一个查询,直到调用某些方法才会执行查询并访问数据库(例如当您调用->all()
,->first()
,->lists()
等特定方法时)。这些方法也存在于Collection
对象中,如果有多个结果,则可以从Query Builder返回它。如果您不确定您实际上正在使用哪个类,请尝试执行var_dump(User::all())
并进行实验以查看它实际返回什么类(可以借助get_class(...)
)。我强烈建议您查看Collection类的源代码,它非常简单。然后查看Query Builder,看看函数名称的相似之处,并找出它何时实际访问数据库。
我想你正在寻找:
$result->isEmpty()
这与empty($result)
不同,因为结果将是一个空集合,empty($result)
将不成立。你提出的count($result)
也是一个好的解决方案。我在文档中找不到任何参考资料。
我同意上面批准的答案。但通常我使用如下所示的$results->isNotEmpty()
方法。
if($results->isNotEmpty())
{
//do something
}
有时候我们会忘记在 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.
我认为最好使用
$result->isEmpty();
我认为你可以尝试类似于以下的方法:
@if(!$result->isEmpty())
// $result is not empty
@else
// $result is empty
@endif
或者也可以使用
if (!$result) { }
if ($result) { }
$result = Model::where(...)->count();
计算结果。
您也可以使用
if ($result->isEmpty()){}
检查结果是否为空。
$counter = count($datas);
现在你可以使用
$query = Model::where(...);
$isExists = $query->exists();
$count = $query->count();
https://laravel.com/docs/10.x/queries#determining-if-records-exist https://laravel.com/docs/10.x/queries#aggregates
first()
,结果与get()
不同,可以通过!$result
进行检查,因为空结果是null
。 - bitinnModel::first()
- 它实际上是在查询构建器的 'first方法上操作而不是集合,因此它将从数据库中获取第一个:但是
Model::get()将返回 Illuminate\Support\Collection 的实例,因此如果您执行了
$r = Model::get()然后
$r->first()` 它将从该集合中挑选出第一项。 - Gary Greencount($result)
是否有效;加上这个细节会更好。 - Mark Ameryforeach
循环迭代集合中的每个成员,然后使用其中一个检查(考虑:count($collection->column)
)。 - PapaHotelPapa