以下是您拥有的代码所发生的情况:
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)
Collection
count()
$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,它将在其上调用该方法。increment
decrement
$method = 'count'
count
最重要的是,第一个和第二个代码示例最终都执行相同的操作:计算 users
表中的所有条目。
而且,正如我上面所指出的,一个ID不能匹配多行(因为ID是唯一的),所以你的问题的答案是没有必要或没有办法计算的结果,因为它只能是0(如果返回)或1(如果返回)。find(2)
null
Model
更新
首先,为了将来的参考,您可以使用 PHP get_class
来确定对象的类名,或者get_parent_class
来确定它正在扩展的类。在你的例子中,第二个函数可能有助于确定模型类,因为该类扩展了一个Laravel抽象模型类。get_parent_class
User
所以如果你有一个模型会报告,但会报告。get_class($coll)
User
get_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 的条目,则将返回:null
find
null
if (is_null($coll))