【问题标题】:Can't use paginate on a query result不能对查询结果使用分页
【发布时间】:2015-10-31 16:43:49
【问题描述】:

根据文档http://book.cakephp.org/3.0/en/controllers/components/pagination.html,我想对如下查询的结果进行分页:

$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);

但我收到以下错误:

错误:调用未定义的方法ArrayIterator::alias() 文件 /home/mywebsite/vendor/cakephp/cakephp/src/Controller/Component/PaginatorComponent.php
线路:154

什么意思?

编辑 @ndm 似乎是对的,但文档说:

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

public function index() 
{
    $query = $this->Articles->find('popular')->where(['author_id' => 1]); 
    $this->set('articles', $this->paginate($query));
}

所以它应该适用于结果集。或者我不明白医生解释了什么。可能。

【问题讨论】:

    标签: cakephp orm pagination cakephp-3.0


    【解决方案1】:

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

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

    因此,如果您在分页中需要这样的分组结果,那么您必须在 SQL 级别(至少部分地)解决这个问题,例如通过相反的方式获取结果,即获取 Sites 及其关联,然后过滤Deviceconnections.request,类似这样的东西(不保证这会给你想要的结果,但这个例子应该给你一个提示!):

    $query = $Sites
        ->find()
        ->contain([
            'Agthemes.Deviceconnections',
            'Agthemes.Agpois',
            'Agthemes.Agthemelanguages'
        ])
        ->matching('Agthemes.Deviceconnections', function(\Cake\ORM\Query $query) {
            return $query
                ->where([
                    'Deviceconnections.request' => 'unlock'
                ]);
        });
    

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

    【讨论】:

    • 看来你是对的,文档似乎说支持结果集。请参阅我的编辑。
    • @caBBAlainB 不,文档说您可以传递查询。一个“resulting query”不是一个“result set”,那是两个不同的东西,两个不同的类(\Cake\ORM\Query,\Cake\ORM\ResultSet),前者是一个查询作为结果返回,后者是执行查询时返回的结果(这就是你正在做的事情)。 book.cakephp.org/3.0/en/orm/…, book.cakephp.org/3.0/en/orm/…
    • @dewwwald 他将答案标记为已接受,也没有必要投票。但是我赞成,因为这正是我需要的答案(以及附加评论)。
    猜你喜欢
    • 2012-12-21
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2021-09-11
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    相关资源
    最近更新 更多