2014-11-24 56 views
1

我有表格如何在活动记录中使用连接时选择特定列

1)topic_tag_map。 列:ID,topic_id,TAG_ID,VERSION_NAME
2)标签 列:ID和TAG_NAME

外键是TAG_ID和id

对于这两个我创建模型中的表和定义的关系是这样的:

在topic_tag_map

'topic' => array(self::BELONGS_TO, 'Topic', 'topic_id'), 

'tagging' => array(self::BELONGS_TO, 'Tagging', 'tag_id'), 

这里我只想获取从标签表的TAG_NAME。 所以,我想这一点:

$tags = TopicTagMap::model()->with(array(
      'tagging'=>array(
       'select' => 'tagging.tag_name', 
       'joinType'=>'INNER JOIN', 
       'condition' => 'topic_id = '.$topic->id.' and version_name = 1', 
       ), 
      ))->findAll(); 

但它给所有列。

之后,我想这也:

$tags = TopicTagMap::model()->findAll(array(
      'select' => 'tagging.tag_name', 
      'condition' => 'topic_id = '.$topic->id.' and version_name = 1', 
      'with' => 'tagging', 
      )); 

但是这投掷的错误: 无效的列名

+0

PLZ人帮助是严重的问题 – RahulG 2014-11-24 13:54:49

回答

0

你有没有尝试过这样的:

$criteria = new CDbCriteria; 
    $criteria->with = 'tagging'; 
    $criteria->select = 'tagging.tag_name'; 
    $criteria->together = true; 
    $criteria->addCondition('t.topic_id = '.$topic->id, 'AND'); 
    $criteria->addCondition('t.version_name = 1', 'AND'); 

    $tags = TopicTagMap::model()->findAll($criteria); 

你必须定义关系Tagging型号为

'tag_map' => array(self::HAS_MANY,'TopicTagMap','tag_id'), 
    //You can use self::HAS_MANY or self::HAS_ONE or self::MANY_MANY on your tables relationship type. 
+0

没有不工作,但我得到这个错误 活动记录“TopicTagMap”试图选择一个无效的列“tagging.tag_name”。请注意,该列必须存在于表中或者是具有别名的表达式。 – 2014-11-24 13:15:28

+0

对不起,我忘了将CDbCriteria的属性设置为true。 – 2014-11-24 13:17:41

+0

你能告诉我们模型'标记'的关系吗? – 2014-11-24 13:21:16

0

你给出的方式会导致sql注入只是使用params。

对于活动记录使用的关系,你只需要添加此

$criteria = new CDbCriteria; 
    $criteria->with = 'tagging'; 
    $criteria->together = true; 
    $criteria->select = 'tagging.tag_name'; 
    $criteria->addCondition('t.topic_id = :tId'); 
    $criteria->addCondition('t.version_name = 1'); 
    $criteria->params = array(":tId" => $topic->id); 
    $tags = TopicTagMap::model()->findAll($criteria); 

希望这将解决您的问题

+0

这也给出了相同的错误 活动记录“TopicTagMap”试图选择无效列“tagging.tag_name”。请注意,该列必须存在于表中或者是具有别名的表达式。 – 2014-11-24 13:20:24