CakePHP 4 自定义查询结果如何分页,添加查询条件报错怎么解决
CakePHP 4 分页添加关联表查询条件解决方案
错误原因
CakePHP 4 和 2.x 的分页、关联查询逻辑差异较大,你遇到报错是因为默认contain加载关联表时,针对所有关联类型默认使用单独查询策略,主查询不会关联关联表,直接在分页顶级conditions中写关联表字段,会因为主查询不存在该字段触发数据库报错。
正确写法按你的使用场景分为两类:
场景1:需要筛选主表数据,仅返回关联表AssociatedTable2满足column3=15的主表记录
使用matching()方法将关联表join到主查询中,再传入查询对象到分页方法:
// 构造带筛选条件的查询对象 $query = $this->PrimaryTable->find() ->contain(['AssociatedTable1', 'AssociatedTable2', 'AssociatedTable3']) ->matching('AssociatedTable2', function (\Cake\ORM\Query $q) { return $q->where(['AssociatedTable2.column3' => 15]); }); // 传入查询对象完成分页 $result = $this->paginate($query); $this->set(compact('result'));
场景2:不需要筛选主表数据,仅加载关联表时过滤AssociatedTable2的返回结果
将筛选条件写到contain的关联回调中即可:
$this->paginate = [ 'contain' => [ 'AssociatedTable1', 'AssociatedTable2' => function (\Cake\ORM\Query $q) { return $q->where(['AssociatedTable2.column3' => 15]); }, 'AssociatedTable3' ] ]; $result = $this->paginate($this->PrimaryTable); $this->set(compact('result'));
补充说明
如果你的PrimaryTable和AssociatedTable2是一对一/多对一关联,也可以修改关联定义的查询策略为JOIN,此时直接写在分页顶级conditions中的关联表条件也会生效,但该方式会影响所有用到该关联的查询,灵活度低于上面的场景化写法。
内容的提问来源于stack exchange,提问作者Chauncey Starkey
相关产品推荐
相关产品推荐

