Laravel Collections计算结果

时间:2015-05-11 22:40:20

标签: php laravel collections

在用户模型(包含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();

工作,但这是正确的方法吗?

3 个答案:

答案 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);
}

正如您所看到的,该方法会尝试查看是否应调用几个硬编码方法(incrementdecrement),这在当然情况下不匹配,因为{{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...
}