323

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

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

4

12 回答 12

668

使用时,->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) { ... }

注释/参考

奖金信息

Collection 和 Query Builder 的区别可能会让 Laravel 的新手感到困惑,因为两者之间的方法名称通常相同。出于这个原因,知道你在做什么可能会让人困惑。Query Builder 本质上是构建一个查询,直到您调用一个方法,它将执行查询并访问数据库(例如,当您调用某些方法->all() ->first() ->lists()和其他方法时)。这些方法存在于Collection对象上,如果有多个结果,可以从查询生成器返回。如果您不确定您实际使用var_dump(User::all())的是什么课程,请尝试执行并尝试查看它实际返回的课程(借助get_class(...))。我强烈建议您查看 Collection 类的源代码,它非常简单。然后查看查询构建器并查看函数名称的相似之处,并找出它何时真正到达数据库。

于 2013-12-14T16:22:04.283 回答
88

我认为您正在寻找:

$result->isEmpty()

这与 不同empty($result),后者不成立,因为结果将是一个空集合。您的建议count($result)也是一个很好的解决方案。我在文档中找不到任何参考

于 2013-12-13T10:23:11.953 回答
15

我同意上述批准的答案。但通常我使用$results->isNotEmpty()下面给出的方法。

if($results->isNotEmpty())
{
//do something
}

它比if(!results->isEmpty())有时我们忘记添加“!”更冗长。在前面,这可能会导致不必要的错误。

请注意,此方法从5.3版开始存在。

于 2017-06-02T07:59:58.590 回答
10

Laravel 中给出了几种检查结果计数/检查空/非空的方法:

$result->isNotEmpty(); // True if result is not empty.
$result->isEmpty(); // True if result is empty.
$result->count(); // Return count of records in result.
于 2018-01-07T15:49:05.093 回答
5

我觉得更好用

$result->isEmpty();

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

于 2018-12-29T19:40:21.020 回答
5

根据 Laravel文档状态,您可以使用这种方式:

$result->isEmpty();

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

于 2019-03-01T09:42:30.777 回答
4

我想你尝试类似的东西

  @if(!$result->isEmpty())
         // $result is not empty
    @else
        // $result is empty
    @endif

或者也使用

if (!$result) { }
if ($result) { } 
于 2018-06-30T10:29:38.957 回答
3

你可以做

$result = Model::where(...)->count(); 

计算结果。

你也可以使用

if ($result->isEmpty()){}

检查结果是否为空。

于 2018-04-01T06:30:53.103 回答
1

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

于 2020-02-06T09:15:23.670 回答
0

你想检查这两种情况count()

#1

如果结果仅包含数据库中的单行(一条记录),则使用->first().

if(count($result)) {
    // record is exist true...
}

#2

如果结果包含使用->get()or的多行(多条记录)集->all()

if($result->count()) {
    //record is exist true...
}
于 2018-03-07T05:45:51.063 回答
0

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

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

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

于 2015-11-24T05:06:40.907 回答
0

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

public function isAbsolutelyEmpty($value)
{
   return in_array($value, ["", "0", null, 0, 0.0], true);
}
于 2021-12-19T12:25:20.767 回答