【问题标题】:CakePHP3: How to get the query result count if the result is a collection?CakePHP3:如果结果是集合,如何获取查询结果计数?
【发布时间】:2016-12-02 17:28:14
【问题描述】:

我有以下代码:

$sites = $this->Sites->find()
->contain([
    'Sitecategories',
    'Sitedescriptions.Languages',
    'Countries',
    'Users'
])
->where([
    'postcode LIKE' => $this->request->data['numero'] . '%'
])
->sortBy(function($row) { return substr($row->postcode, 0, 2); }, SORT_ASC);

调试($sites);显示:

object(Cake\Collection\Iterator\SortIterator) {

'count' => (int) 428

}

但我不明白如何访问该计数变量。

我尝试访问$sites->count(),但收到以下错误消息:

Error: You cannot issue a count on a Collection.

【问题讨论】:

    标签: cakephp collections count iterator cakephp-3.0


    【解决方案1】:

    计数集合有点不可靠,因为它们在迭代时可能会发生变异,即计数和内容可能会发生变化,并且每次迭代时,可能会为某些操作重新应用更改,从而导致集合可能以一种不受欢迎的方式发生变异(过滤、减少、修改包含的对象等)。另一个不想要的效果可能是不可回退的集合,即它们不能再被迭代。所以这基本上就是为什么没有实现 count 方法的原因。

    那里显示的调试信息是返回值iterator_count(),它接受可遍历的对象并返回迭代器中的元素数。调用它会产生上述副作用,集合将被迭代并可能发生变异。

    如果您确实需要知道计数,并且想要保留该集合,那么您可以例如预先编译它,这将基于应用了所有修改的源数据创建一个新集合,例如:

    $sites = $sites->compile();
    $count = iterator_count($sites);
    

    $sites 在此之后可以安全地重复使用。

    如果您不再需要该集合,您可以随时简单地将其转换为数组并计算:

    $sites = $sites->toArray();
    $count = count($sites);
    

    另见

    【讨论】:

    • 好的,我明白了,非常感谢。
    【解决方案2】:

    另一种可能的解决方案是使用缓冲迭代器。

    $collection = new Collection([1,2,3]);
    $collection->count(); //throws exception
    $collection->buffered()->count(); //gives 3
    

    【讨论】:

      【解决方案3】:

      你必须使用count($sites->toArray())

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-05
        • 1970-01-01
        相关资源
        最近更新 更多