簡體   English   中英

使用聯接表的CGridView過濾/搜索關系

[英]CGridView filtering/searching relations using joining table

我知道這個主題有100萬個線程,通過它們我發現了不同的信息,找不到一個特定於我的問題的信息,這個主題上過多的線程實際上比只有少數幾個有用。 請有人花幾分鍾時間幫助您。

我有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,在此網格視圖中,我想顯示問題記錄(我可以這樣做),我也想顯示與每個問題記錄的“文本”字段關聯的所有標簽記錄,因此“ tag.text” ,在同一列中。 我還需要能夠過濾這些標簽,對於每個Question_Tag記錄是否單獨完成標簽的實際搜索/過濾都沒有關系,但是在網格中顯示時,它們應該在同一列中。

閱讀完每個Wiki頁面,教程和論壇主題后,我就無法終生,找出解決方法。 我可以找到解決方案的片段,但無法將它們放在一起。 我只使用Yii幾天了,所以我想我不太了解這一切。

誰能為我指出如何處理這種情況的正確方向?

非常感謝你!

$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函數來顯示標簽,因此您已在各自的控制器中編寫了following函數

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*/
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM