Php 拉威尔集合计数结果
在用户模型(包含4条记录的表)上,执行以下操作时:Php 拉威尔集合计数结果,php,laravel,collections,Php,Laravel,Collections,在用户模型(包含4条记录的表)上,执行以下操作时: $coll = User::all(); echo $coll->count(); $coll = User::find(2); echo $coll->count(); 我得到了找到的记录数量(4) 但当我这样做的时候: $coll = User::all(); echo $coll->count(); $coll = User::find(2); echo $coll->count(); 我得到的不是1(正如
$coll = User::all();
echo $coll->count();
$coll = User::find(2);
echo $coll->count();
我得到了找到的记录数量(4)
但当我这样做的时候:
$coll = User::all();
echo $coll->count();
$coll = User::find(2);
echo $coll->count();
我得到的不是1(正如我所期望的),而是结果集合中属性的数量(本例中为23)
如何检查是否找到多个记录
更新: 好的,多亏了你们,我现在看到了集合和模型在结果上的差异 但我真正的问题是,我必须检测我是否因此拥有一个模型或一个集合。根据这个结果,我对items(使用map()或model)中字段的内容执行一些更改。如何检测结果是模型还是集合
if(count($coll) > 1)
工作正常,但这是正确的方法吗?您似乎希望用户的行为有所不同。从
下面是您的代码的情况: 1.调用
User::all()
时,您将得到一个illighted\Database\elount\Collection
可以调用它,它对集合中的元素进行计数,如下所示:
public function count()
{
return count($this->items);
}
这将返回集合中正确预期的项数
2.但是,当调用User::find(2)
时,雄辩的查询生成器不会返回集合
,因为它将检查有多少个结果,并且由于您传递了一个ID,您最多只能得到一个结果,因此它将返回雄辩的模型。模型没有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);
}
// 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)
如您所见,该方法尝试查看是否应该调用两个硬编码方法(increment
和decrement
),这两个方法在本例中当然不匹配,因为$method='count'
,因此它会继续创建一个新查询,并在该查询上调用count
方法
底线是,第一个和第二个代码示例最终都做了相同的事情:计算用户
表中的所有条目
正如我在上面指出的,由于一个ID不能匹配多行(因为ID是唯一的),您的问题的答案是没有必要或没有方法计算find(2)
,因为它只能是0(如果null
返回)或1(如果Model
返回)
更新
首先,为了便于将来参考,您可以使用PHP来确定对象的类名或确定它正在扩展的类。在您的例子中,第二个函数get\u parent\u class
可能有助于确定模型类,因为User
类扩展了一个Laravel抽象模型类
因此,如果您有一个模型,那么get\u class($coll)
将报告User
,但是get\u parent\u class($coll)
将报告\illumb\Database\elount\model
现在,要检查结果是可以使用的集合还是模型,请执行以下操作:
instanceof
用于确定PHP变量是否是某个类的实例化对象
您的支票应如下所示:
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);
}
// 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))
如果您的问题是通过检查它是否来自集合。为什么不检查它是否来自Lightning\Database\Eloquent\Collection
if (get_class($coll) == 'Illuminate\Database\Eloquent\Collection') {
your code...
}
或
我不相信::find()
实际上返回一个集合。@如果你给它传递一个id数组,它实际上可以。但在这种情况下,如果找到id为2的条目,它将返回一个雄辩的模型。@Bogdan,说得好。我想我应该更明确地说::find(2)
不会返回集合。当然!我没有区分收藏和模型。谢谢你帮我清理这个!请查看更新后的问题,了解我正在寻找的真正解决方案。@Klaaz我已经用您更新后的问题的解决方案更新了答案。太好了!这让事情变得非常清楚,感谢您的解释:-)