在用户模型(包含4条记录的表格)上,当我这样做时:
SessionDate Start: End: Easting Northing
27-Apr-07 22:30 23:25 171984 9784738
28-Apr-07 0:25 1:30 174739 9785206
我得到了找到的记录数量(4)。
但是当我这样做时:
$coll = User::all();
echo $coll->count();
我没有获得1(正如我所料)但是得到的集合中的属性数量(在这种情况下为23)。
如何检查是否找到多条记录?
更新
好的,多亏你们,我现在看到了收集和模型之间的结果差异。
但我真正的问题是我必须检测我是否有模型或集合。根据此结果,我对项目(使用map())或模型中的字段内容执行一些更改。如何检测结果是模型还是集合?
$coll = User::find(2);
echo $coll->count();
工作,但这是正确的方法吗?
答案 0 :(得分:5)
以下是您所拥有的代码的内容:
1。在致电User::all()
时,您将获得一个Illuminate\Database\Eloquent\Collection
,您可以在其中调用count
来计算集合中的元素,如下所示:< / p>
public function count()
{
return count($this->items);
}
这将按正确的预期返回集合中的项目数。
2。但是,当调用User::find(2)
时,Eloquent Query Builder将不会返回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
),这在当然情况下不匹配,因为{{1}所以它继续创建一个新的Query,它将调用$method = 'count'
方法。
底线是第一个和第二个代码示例最终都做同样的事情:计算count
表中的所有条目。
因为,正如我上面指出的那样,一个ID不能匹配多行(因为ID是唯一的),您的问题的答案是没有必要或方法来计算结果users
,因为它只能为0(如果返回find(2)
)或1(如果返回null
)。
<强>更新强>
首先,为了将来参考,您可以使用PHP get_class
来确定对象的类名,或get_parent_class
来确定它正在扩展的类。在您的情况下,第二个函数Model
可能对确定模型类很有用,因为get_parent_class
类扩展了Laravel抽象Model类。
因此,如果您有模型User
将报告get_class($coll)
,但User
将报告get_parent_class($coll)
。
现在检查结果是集合还是模型,您可以使用instanceof
:
\Illuminate\Database\Eloquent\Model
用于确定PHP变量是否是某个类的实例化对象
您的支票应如下所示:
instanceof
您可能还想检查结果是否为// 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
答案 1 :(得分:1)
您似乎期望find()-method的行为不同。来自docs
Find a model by its primary key.
答案 2 :(得分:0)
如果您的问题是通过检查其是否来自集合。为什么不检查它是否来自Illuminate \ Database \ Eloquent \ Collection。
if (get_class($coll) == 'Illuminate\Database\Eloquent\Collection') {
your code...
}
或
if ($coll instanceof \Illuminate\Database\Eloquent\Collection) {
your code...
}