我有以下关系:
发表了很多评论
发布所属类别
发布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关系。谢谢。
答案 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的帖子。
希望这有助于某人。