我结构简单: 用户有帖子,帖子有标签。
如何获取分配了给定用户帖子的所有标签?
我试过这样做:
$criteria = new CDbCriteria();
$criteria->together = true;
$criteria->with = array('posts');
$criteria->addSearchCondition('posts.user_id', $this->id);
//or this (by the way, what's the difference?):
//$criteria->compare('posts.user_id', $this->id);
$tags = Tag::model()->findAll($criteria);
但它有问题..这个条件给我标签,仅分配此用户的帖子。但我需要获取至少分配了该用户的一个帖子的标签。
换句话说,如果是标签,它分配了两个帖子:post1和post2(post1.user_id = 1 post2.user_id = 2),但我的用户有id = 1,那么这个标签不会是结果。但我希望得到这个标签,因为它分配了post1(post1.user_ud = 1),我不关心其他帖子/用户。
答案 0 :(得分:1)
如果我理解这一点,那么您正在寻找一种方法来获取用户使用过的所有标签。 设置MANY_to_MANY rel的最简单方法是在模型关系中:
用户模型中的:
function relations()
{
return array(
'tags' => array(
self::MANY_MANY,
'Tag',
'posts(user_id, tag_id)'
),
);
}
然后使用您的模型,您就可以请求它们:
//gives you all the tags for user with PK 1
$usertags = User::model()->findByPK(1)->tags;
参考:http://www.yiiframework.com/doc/guide/1.1/en/database.arr#declaring-relationship
编辑:根据评论我编辑我的帖子,在Active Record上有更多例子
$criteria=new CDbCriteria;
$criteria->with='tags';
$criteria->select='tag_name';
$criteria->condition='user=:userID';
$criteria->params=array(':userID'=>10);
$usertags =User::model()->findAll($criteria);