CakePHP 2.0:将paginate与hasMany和HABTM一起使用

时间:2012-06-25 16:56:04

标签: cakephp has-and-belongs-to-many paginate

我有以下关系:

发表了很多评论

发布所属类别

发布HABTM标签

我想将paginate方法与这些属性一起使用:

public $paginate = array(
    'published',
    'limit' => 3,
    'fields' => array(
        'Post.title',
        'Post.date_published',
        'Post.abstract',
        'Post.slug',
        'Category.value',
        'Category.slug'
    )
);

'published'是一个自定义的查找查询,但这不重要。 除了关于帖子及其类别(见上文)的信息之外,我想获取帖子的COUNT评论,以及所有标签的名称。即,我希望能够以方便的方式访问View端的数据,例如$ data ['Post'] ['comment_count']和$ data ['Post'] ['Tag'] [0] [ '名称']。

是否有足够优雅的解决方案?我知道HABTM可能有点复杂,但我甚至不知道如何在同一个查询中获取注释,即使它只是一个hasMany关系。谢谢。

1 个答案:

答案 0 :(得分:0)

我发现使用Comment模型中的counterCache参数如下

public $belongsTo = array('Post' => array('counterCache' => true));

并在posts表中添加comments_count字段是获取帖子评论数量的最简单方法。每当添加或删除新的评论时,这将更新表格。

关于Tags,我使用contains数组,它也可以用于paginate。我这样用它:

$this -> paginate = array(
        'published',
        'limit' => 3,
        'contain' => array(
            'Category',
            'Tag' => array('fields' => array(
                    'value',
                    'slug'
                ))
        ),
        'fields' => array(
            'Post.title',
            'Post.date_published',
            'Post.abstract',
            'Post.slug',
            'Post.comment_count',
            'Category.value',
            'Category.slug'
        ),
        'conditions' => $conditions,
        'joins' => $joins
    );

这样做,只有类别和Tag模型的字段值和slug与每个Post请求一起提取。

有一种特殊情况,当我想要获取具有特定标签的所有帖子时。请记住,这是一种HABTM关系。我遇到了这个有用的模型方法by Geoff Garbers

将其添加到AppModel,它允许调用hasAndBelongsToMany,并自动化为paginate方法定义连接的繁琐过程。如上所示,它们是通过$ joins数组添加的,该数组是使用上述方法生成的:

$joins = $this -> Post -> generateHabtmJoin('Tag');

现在很容易定义条件,例如:

$conditions = array('Tag.slug' => $this -> request -> params['tag']);

只能获取具有特定Tag.slug的帖子。

希望这有助于某人。