拉拉维尔收藏盘点结果

2022-08-30 18:33:53

在用户模型(包含 4 条记录的表)上,当我这样做时:

$coll = User::all();
echo $coll->count();

我得到找到的记录数量 (4)。

但是当我这样做时:

$coll = User::find(2);
echo $coll->count();

我没有得到1(正如我所期望的那样),而是结果集合中的属性数量(在本例中为23)。

如何检查是否找到多个记录?


更新:

好的,多亏了大家,我现在看到了集合和模型之间结果的差异。

但我真正的问题是,我必须检测我是否因此拥有模型或集合。根据此结果,我对项目(使用map())或模型中的字段内容执行一些更改。如何检测结果是模型还是集合?

if(count($coll) > 1)

有效,但这是正确的方法吗?


答案 1

以下是您拥有的代码所发生的情况:

1.调用时,您将获得一个可以调用count的计数,该计数集合中的元素,如下所示:User::all()Illuminate\Database\Eloquent\Collection

public function count()
{
    return count($this->items);
}

这将按正确预期返回集合中的项数。

2. 但是,在调用时,Eloquent Query Builder 不会返回 a,因为它将检查有多少个结果,并且由于您传递了一个 ID,因此您最多只能获得一个结果,因此它将返回一个 Eloquent 模型。模型没有方法,因此当您尝试调用它时,它将转到该类已实现的魔术__call方法,如下所示:User::find(2)Collectioncount()$coll->count();

public function __call($method, $parameters)
{
    if (in_array($method, array('increment', 'decrement')))
    {
        return call_user_func_array(array($this, $method), $parameters);
    }

    $query = $this->newQuery();

    return call_user_func_array(array($query, $method), $parameters);
}

如您所见,该方法试图查看它是否应该调用几个硬编码的方法( and ),这些方法在本例中当然不匹配,因为 ,因此它继续创建一个新的 Query,它将在其上调用该方法。incrementdecrement$method = 'count'count

最重要的是,第一个和第二个代码示例最终都执行相同的操作:计算 users 表中的所有条目

而且,正如我上面所指出的,一个ID不能匹配多行(因为ID是唯一的),所以你的问题的答案是没有必要或没有办法计算的结果,因为它只能是0(如果返回)或1(如果返回)。find(2)nullModel


更新

首先,为了将来的参考,您可以使用 PHP get_class来确定对象的类名,或者get_parent_class来确定它正在扩展的类。在你的例子中,第二个函数可能有助于确定模型类,因为该类扩展了一个Laravel抽象模型类。get_parent_classUser

所以如果你有一个模型会报告,但会报告。get_class($coll)Userget_parent_class($coll)\Illuminate\Database\Eloquent\Model

现在,要检查结果是集合还是模型,您可以使用实例

instanceof用于确定 PHP 变量是否为某个类的实例化对象

您的支票应如下所示:

// Check if it's a Collection
if ($coll instanceof \Illuminate\Support\Collection)

// Check if it's a Model
if ($coll instanceof \Illuminate\Database\Eloquent\Model)

您可能还想检查结果是否为 ,因为如果未找到具有给定 ID 的条目,则将返回:nullfindnull

if (is_null($coll))

答案 2

似乎您期望 find() 方法的行为方式不同。从文档

Find a model by its primary key.

推荐