这是您那里的代码的情况:
1. 调用User::all() 时,您将获得一个Illuminate\Database\Eloquent\Collection,您可以在其上调用count,它计算集合中的元素,如下所示:
public function count()
{
return count($this->items);
}
这将返回您正确预期的集合中的项目数。
2. 但是,当调用 User::find(2) 时,Eloquent 查询构建器不会返回 Collection,因为它会检查有多少结果,并且由于您通过了 一个 ID 你最多会得到 一个结果,所以它会返回一个 Eloquent 模型。该模型没有count() 方法,因此当您尝试调用$coll->count(); 时,它将转到该类已实现的神奇__call 方法,如下所示:
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);
}
如您所见,该方法尝试查看是否应该调用几个硬编码方法(increment 和 decrement),在这种情况下它们当然不匹配,因为 $method = 'count',所以它继续创建一个新的查询,它将在其上调用count 方法。
最重要的是,第一个和第二个代码示例最终都做了同样的事情:计算users 表中的所有条目。
而且,正如我在上面指出的那样,一个 ID 不能匹配多于一行(因为 ID 是唯一的),您的问题的答案是没有必要或方法来计算结果find(2),因为它只能是 0(如果返回 null)或 1(如果返回 Model)。
更新
首先,为了将来参考,您可以使用 PHP get_class 来确定对象的类名或使用get_parent_class 来确定它正在扩展的类。在您的情况下,第二个函数 get_parent_class 可能对确定模型类很有用,因为 User 类扩展了 Laravel 抽象模型类。
所以如果你有一个模型get_class($coll) 将报告User,但get_parent_class($coll) 将报告\Illuminate\Database\Eloquent\Model。
现在检查结果是集合还是模型,您可以使用instanceof:
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)
您可能还想检查结果是否为 null,因为如果没有找到具有给定 ID 的条目,find 将返回 null:
if (is_null($coll))