无法在查询结果上使用paginate

时间:2015-08-08 08:35:54

标签: cakephp orm pagination cakephp-3.0

根据文档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()方法将使用控制器的默认模型。您还可以传递查找方法的结果查询:
  public function index(){$ query = $ this-> Articles-> find('popular') - > where(['author_id'=> 1]); $ this-> set('articles',$ this-> paginate($ query));}

所以它应该适用于结果集。或者我不明白文档解释的内容。可能的。

1 个答案:

答案 0 :(得分:4)

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

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'
            ]);
    });

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