Php 拉威尔集合计数结果

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(正如

在用户模型(包含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(正如我所期望的),而是结果集合中属性的数量(本例中为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我已经用您更新后的问题的解决方案更新了答案。太好了!这让事情变得非常清楚,感谢您的解释:-)