CGridView使用连接表过滤/搜索关系

时间:2013-07-30 12:33:25

标签: php relationship yii cgridview

我知道在这个主题上有一百万个帖子,通过它们我找到了不同的信息,找不到一个特定于我的问题,关于这个主题的过多的线程实际上没有比只有一个屈指可数。请有人花几分钟时间帮忙。

我有3个表,这里有相关的字段

Question (primary key = id)
Tag (primary key = id, text)
Question_Tag (question_id, tag_id)

问题模型关系

     return array(
        'tags'=>array(
            self::MANY_MANY,
            'Tags',
            'question_tag(tag_id, question_id)'
        ),
        'question_tag'=>array(
            self::HAS_MANY,
            'QuestionTag',
            'question_id',
        ),
    );
}

标记模型关系

     return array(
        'questions'=>array(
            self::MANY_MANY,
            'Questions',
            'question_tag(question_id, tag_id)'
        ),
        'question_tag'=>array(
            self::HAS_MANY,
            'QuestionTag',
            'tag_id',
        ),
    );
}

我有一个CGridView,在这个网格视图中我想显示问题记录(我可以做),我还要显示,所有与每个问题记录相关的标记记录,'text'字段,所以“标记.text“,在同一栏中。我还需要能够过滤这些标签,如果标签的实际搜索/过滤是针对每个Question_Tag记录单独完成的,则无关紧要,但是在Grid中显示它们应该在同一列中。

在阅读每个维基页面,教程和论坛帖子后,我不能为我的生活,弄清楚如何做到这一点。我可以找到解决方案的片段,但我不能把它们放在一起。我只使用Yii几天,所以我想我并不理解这一切。

有人能指出我如何处理这种情况的正确方向吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider, //Data Provider Of Quuestions
'columns'=>array(
            array(            
                        'name'=>'name',
                        'value'=>'$data->name',
            ),
            array(
                'name'=>'tags'  
                'header'=>'Tags',
                'value'=>array($this,'displayRelatedTags'),
            ),),));

上面的小部件将调用displayRelatedTags函数来显示标签,所以你在各自的控制器中编写了以下功能

public function displayRelatedTags($data,$row)
{
foreach($data->tags as $tag) /*$data->tags is relation which you defined as MANY TO MANY in Questions class*/
{
$arrTags[]=$tag->text;
}
return implode(',',$arrTags); /*It will display comma sepearated tags in same row*/
}