cakephp 如何对关联记录进行分页?

7uzetpgm  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(162)

Products belongsToMany CategoriesCategories hasMany Products,在我的Product视图中,我显示了它的所有类别的列表,但我希望对这些结果进行分页或限制。
我在ProductsController上的当前代码是:

$product = $this->Products
    ->findBySlug($slug_prod)
    ->contain(['Metas', 'Attachments', 'Categories'])
    ->first();

$this->set(compact('product'));

我知道我需要设置$this->paginate()来分页,但是我不能让它对产品中的类别分页。我希望你们能理解我。
更新:目前我有这个正在进行:

$product = $this->Products->findBySlug($slug_prod)->contain([
              'Metas',
              'Attachments',
              'Categories' => [
                'sort' => ['Categories.title' => 'ASC'],
                'queryBuilder' => function ($q) {
                  return $q->order(['Categories.title' => 'ASC'])->limit(6);
                }
              ]
            ])->first();

限制有效,但我还不知道如何分页

7kqas0il

7kqas0il1#

分页器不支持对关联进行分页,您必须在一个单独的查询中手动读取关联的记录,并对该记录进行分页,沿着所示:

$product = $this->Products
    ->findBySlug($slug_prod)
    ->contain(['Metas', 'Attachments'])
    ->first();

$categoriesQuery = $this->Products->Categories
    ->find()
    ->innerJoinWith('Products', function (\Cake\ORM\Query $query) use ($product) {
        return $query->where([
            'Products.id' => $product->id,
        ]);
    })
    ->group('Categories.id');

$paginationOptions = [
    'limit' => 6,
    'order' => [
        'Categories.title' => 'ASC'
    ]
];

$categories = $this->paginate($categoriesQuery, $paginationOptions);

$this->set(compact('product', 'categories'));

然后,在视图模板中,您可以显示您的$product,并像往常一样单独为$categories分页。
另请参阅



*Cookbook〉数据库访问和ORM〉查询生成器〉按关联数据筛选

相关问题