2013-06-04 82 views
0

我是Yii的新手,我很难将SQL查询翻译成Yii Active Record语言或查询生成器。复杂的Yii SQL语句

我有3个表: - 发布:ID,文本 - 标签:ID,名称 - Post_Tag:id_post,id_tag

我想要做的是能够选择具有所有职位选择标签用户: 这里是工作的SQL语句,我想转换为Yii的语言:

SELECT * FROM Post p INNER JOIN tags pt ON p.id=pt.post_id WHERE pt.tag_id in(10, 13) group by pt.post_id having count(distinct pt.tag_id) > 1; 

是别人有事要帮我?提前致谢 !

+0

开始http://stackoverflow.com/questions/11015311/yii-cdbcriteria-complex-joins?rq=1和http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder – topher

回答

0

为了让您查询,您应该能够做这样的事情:

$criteria = new CDbCriteria(); 
$criteria->join = "INNER JOIN tags pt ON t.id=pt.post_id"; 
$criteria->addInCondition("pt.tag_id", array(10,13)); 
$criteria->group = "t.id"; 
$criteria->having = "COUNT(DISTINCT pt.tag_id) > 1"; 

$posts = Posts::model()->findAll($criteria); 

如果你想与某个标签的所有帖子,你可以使用标签模型的一些关系。

在你的标签模型文件:

public function relations() 
{ 
    return array(
     'postTags' => array(self::HAS_MANY, 'PostsTags', 'tag_id'), 
     'posts' => array(self::HAS_MANY, 'Posts', array('post_id'=>'id'), 'through'=>'postTags'), 
     //Other relations here 
    ); 
} 

然后你就可以得到的职位像这样的标签:

$tag = Tags::model()->findByPk(10); 
$posts = $tag->posts; 

如果要过滤

您可以添加条件的关系
+0

非常感谢,我终于谢谢了你的解释! – euitam