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()
,它返回另一个集合
站点及其关联,并通过设备连接进行过滤。请求,类似这样的内容(不能保证这会给您期望的结果,但示例应该给您一个提示!):
当然,您必须相应地调整视图代码。这意味着您传递了错误类型的对象。不支持对结果集进行分页,只支持表(对象或名称)和查询
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'
]);
});