我想要实现的目标非常简单,但我无法找到正确的方法。
我的数据库上有一个Products表。每个产品都有许多图像和颜色,属于一个或多个类别。
我试图创建一个接收类别ID的动作并返回它包含的产品,分页。
这就是我的代码现在的样子,我尝试了两种不同的方法:
$paginatorQuery = $this->Categories->Products->find('all', [
'contain' => [
'Categories' => [
'conditions' => [
'category_id' => $categoryId
]
],
'Colors',
'Images'
],
'conditions' => $conditionArray,
'order' => [
$session->read('productSort.field') => $session->read('productSort.direction')
],
]);
$catProd = $this->Categories->get($categoryId, [
'contain' => [
'Products' => [
'Colors',
'Images',
'conditions' => $conditionArray,
'sort' => [
$session->read('productSort.field') => $session->read('productSort.direction')
],
]
],
]);
// $catProd = $catProd->products;
$products = $this->paginate($paginatorQuery);
变量$paginatorQuery
没有正确过滤(我知道它不会因为逻辑存在多大缺陷,但决定只是为了以防尝试),而是返回预期(所有现有产品,如果产品属于具有相应ID的类别,产品包含它)。
注释行$catProd = $catProd->products
为变量$catProd
分配了所需的结果集,但我无法对其进行分页。我想通过分配限制并开始查询来实现手动分页,但我认为必须有一些我不知道的东西可以省去我的麻烦。
谢谢!
答案 0 :(得分:2)
您的$paginatorQuery
应在类别上使用matching
,而不是contain
。像这样(未经测试):
$paginatorQuery = $this->Categories->Products->find('all', [
'contain' => [
'Colors',
'Images'
],
'conditions' => $conditionArray,
'order' => [
$session->read('productSort.field') => $session->read('productSort.direction')
],
])
->matching('Categories', function (Query $q) use ($categoryId) {
return $q->where(['Categories.id' => $categoryId]);
});
有关详细信息,请参阅filtering by associated data。