根据文档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));}
所以它应该适用于结果集。或者我不明白文档解释的内容。可能的。
答案 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'
]);
});
您当然必须相应地调整您的视图代码。