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

这可能是一个微不足道的问题,但我想知道Laravel是否推荐了一种特定的方法来检查$result = Model::where(...)->get()返回的Eloquent集合是否为空,以及计算元素的数量。

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

422364 次浏览

我想你正在寻找:

$result->isEmpty()

这与empty($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) { ... }

备注/参考资料

额外的信息

对于刚接触Laravel的人来说,Collection和Query Builder的区别可能有点令人困惑,因为两者的方法名通常是相同的。由于这个原因,知道自己在做什么可能会让人困惑。查询生成器实际上是构建一个查询,直到你调用一个方法,它将执行查询并命中数据库(例如,当你调用某些方法,如->all() ->first() ->lists()和其他)。这些方法存在于Collection对象中,如果有多个结果,可以从查询生成器中返回。如果你不确定你实际处理的是什么类,试着做var_dump(User::all()),看看它实际返回的是什么类(在get_class(...)的帮助下)。我强烈建议您查看Collection类的源代码,它非常简单。然后检查Query Builder,查看函数名称的相似性,并找出它何时真正访问数据库。

,所以Laravel实际上在使用Model::all();时返回一个集合 你不想要一个集合,你想要一个数组,所以你可以类型设置它。 (array)Model::all();,然后你可以使用array_filter返回结果

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

这也将允许你做类似count()的事情。

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

你想检查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 文档声明,你可以这样使用:

$result->isEmpty();

如果集合为空,isEmpty方法返回true;否则返回false

你可以使用: $counter = count($datas);

in_array()检查数组中是否存在一个值。

public function isAbsolutelyEmpty($value)
{
return in_array($value, ["", "0", null, 0, 0.0], true);
}