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

时间:2014-11-24 13:00:51

标签: php mysql activerecord yii model

我有桌子

1)topic_tag_map。 columns:id,topic_id,tag_id,version_name
2)标记 columns: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',
            ));

但这个投掷错误: 列名称无效

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

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

要使用该关系的Active记录,您只需添加此

    $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);

希望这可以解决您的问题