0

我有以下关系:

发表有很多评论

帖子属于类别

发布 HABTM 标签

我想使用具有这些属性的分页方法:

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

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

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

4

1 回答 1

0

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

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

并且在帖子表中添加一个comments_count 字段是获取帖子评论数的最简单的解决方案。每当添加或删除新评论时,这将更新表格。

关于标签,我使用包含数组,它也可以用于分页。我这样使用它:

$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
    );

这样做,每个 Post 请求只获取类别和标签模型的字段值和 slug。

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

将它添加到 AppModel,它允许调用 hasAndBelongsToMany,并自动执行为分页方法定义连接的繁琐过程。正如您在上面看到的,它们是通过 $joins 数组添加的,该数组是使用上述方法生成的:

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

现在可以轻松定义条件,例如:

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

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

希望这可以帮助某人。

于 2012-06-26T11:28:36.317 回答