CakePHP 3分页结果

时间:2017-11-29 14:59:47

标签: php cakephp pagination cakephp-3.0

我想要实现的目标非常简单,但我无法找到正确的方法。

我的数据库上有一个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分配了所需的结果集,但我无法对其进行分页。我想通过分配限制并开始查询来实现手动分页,但我认为必须有一些我不知道的东西可以省去我的麻烦。

谢谢!

1 个答案:

答案 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