2014-09-23 42 views
0

我有简单的结构: 用户有帖子,帖子有标签。Yii。 Many_Many relations上的条件

如何获取所有标签,哪些标签分配给定用户的帖子?

我试图做这种方式:

$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),我不关心其他帖子/用户。

回答

1

如果我理解这个权利,您正在寻找一种方法来获取用户曾经使用过的所有标签。 成立MANY_TO_MANY相对最简单的方法是在模型的关系:

您的用户模型

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

编辑:根据修改我的职务与活动记录更多的范例注释

$criteria=new CDbCriteria; 
$criteria->with='tags'; 
$criteria->select='tag_name'; 
$criteria->condition='user=:userID'; 
$criteria->params=array(':userID'=>10); 
$usertags =User::model()->findAll($criteria); 
+0

这不完全是我想要的。无论如何,我想排序/过滤/限制结果。我能以你的方式做到吗?如果是,如何? – Skiv 2014-09-26 05:19:13

+0

确定这样做:我会更新我的帖子 – DarkMukke 2014-09-26 07:52:10

+0

对不起,但它仍然不是我的意思.. 你写道: ...'帖子(user_id,tag_id)'... 但是帖子和标签isn'直接分配。它也是关系MANY_MANY(帖子可以有很多标签,并且它没有'tag_id'字段)。 – Skiv 2014-09-26 13:47:49