Cakephp Can';不要对查询结果使用分页

Cakephp Can';不要对查询结果使用分页,cakephp,orm,pagination,cakephp-3.0,Cakephp,Orm,Pagination,Cakephp 3.0,根据文档,我想对如下查询的结果进行分页: $unlocked_sitesQuery = $this->Deviceconnections ->find() ->contain([ 'Agthemes.Sites', 'Agthemes.Agpois', 'Agthemes.Agthemelanguages' ]) ->where(['request' => 'unlock'])

根据文档,我想对如下查询的结果进行分页:

$unlocked_sitesQuery = $this->Deviceconnections
    ->find()
    ->contain([
        'Agthemes.Sites',
        'Agthemes.Agpois',
        'Agthemes.Agthemelanguages'
    ])
    ->where(['request' => 'unlock'])
    ->groupBy('agtheme.site.id');

$unlocked_sites = $this->paginate($unlocked_sitesQuery);
但我得到了以下错误:

错误:调用未定义的方法
ArrayInterator::alias()
File/home/mywebsite/vendor/cakephp/cakephp/src/Controller/Component/PaginatorComponent.php
行:154

这是什么意思

编辑 看起来@ndm是对的,但医生说:

默认情况下,
paginate()
方法将使用控制器的默认模型。您还可以传递find方法的结果查询:


所以它应该在一个结果集上工作。或者我不明白医生的解释。可能。

这意味着您传递了错误类型的对象。不支持对结果集分页,只支持表(对象或名称)和查询

groupBy
不是查询类的方法,它是导致执行查询并将方法调用转发到结果集的神奇方法之一。因此,您最终调用了
Cake\ORM\ResultSet::groupBy()
,它返回另一个集合

因此,如果您在分页中需要这样的分组结果,那么您必须在SQL级别上解决这一问题(至少部分),例如,通过另一种方式获取结果,即获取
站点及其关联,并通过
设备连接进行过滤。请求
,类似这样的内容(不能保证这会给您期望的结果,但示例应该给您一个提示!):


当然,您必须相应地调整视图代码。

这意味着您传递了错误类型的对象。不支持对结果集进行分页,只支持表(对象或名称)和查询

groupBy
不是查询类的方法,它是导致执行查询并将方法调用转发到结果集的神奇方法之一。因此,您最终调用了
Cake\ORM\ResultSet::groupBy()
,它返回另一个集合

因此,如果您在分页中需要这样的分组结果,那么您必须在SQL级别上解决这一问题(至少部分),例如,通过另一种方式获取结果,即获取
站点及其关联,并通过
设备连接进行过滤。请求
,类似这样的内容(不能保证这会给您期望的结果,但示例应该给您一个提示!):


当然,您必须相应地调整视图代码。

不管怎样,您似乎是对的,文档似乎说结果集受支持。请参阅我的编辑。@caBBAlainB不,文档说您可以传递查询。“结果查询”不是“结果集”,这是两个不同的东西,两个不同的类(
\Cake\ORM\Query
\Cake\ORM\ResultSet
),前者是作为结果返回的查询,后者是执行查询时返回的结果(这就是您正在执行的操作),@Dewwald他将答案标记为已接受,没有必要再投票。但是我投票了,因为这正是我需要的答案(以及附加注释)。无论如何,你似乎是对的。文档似乎说结果集是受支持的。请参见我的编辑。@caBBAlainB不,文档说你可以通过查询。a“结果查询”不是“结果集”,这是两个不同的东西,两个不同的类(
\Cake\ORM\query
\Cake\ORM\ResultSet
),前者是作为结果返回的查询,后者是执行查询时返回的结果(这就是您正在做的)“@dewwald He’s’s mark the response as accepted,没有必要再投票了。不过,我已经投票了,因为这正是我需要的答案(以及附加评论)。
public function index() 
{
    $query = $this->Articles->find('popular')->where(['author_id' => 1]); 
    $this->set('articles', $this->paginate($query));
}
$query = $Sites
    ->find()
    ->contain([
        'Agthemes.Deviceconnections',
        'Agthemes.Agpois',
        'Agthemes.Agthemelanguages'
    ])
    ->matching('Agthemes.Deviceconnections', function(\Cake\ORM\Query $query) {
        return $query
            ->where([
                'Deviceconnections.request' => 'unlock'
            ]);
    });