2013-07-30 32 views
0

我知道這個主題上有一百萬條和一條線索,通過它們我發現不同的信息,並且找不到一個特定於我的問題的線程關於此主題的豐富內容實際上比只有少數人更有幫助。請有人花幾分鐘時間來幫忙。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 , 一世在這個網格視圖中,我想顯示問題記錄(我可以這樣做),我還想顯示與每個問題記錄的'文本'字段相關聯的所有標記記錄,因此「tag.text」在同一列中。我還需要能夠過濾這些標籤,如果標籤的實際搜索/過濾是針對每個Question_Tag記錄單獨完成的,但是在網格中顯示它們應該在同一列中,則無關緊要。

在閱讀完每一個wiki頁面,教程和論壇主題之後,我不能爲了我的生活,找出如何去做。我可以找到解決方案的碎片,但我無法將它們放在一起。我只使用Yii幾天,所以我想我不能正確理解這一切。

任何人都可以在正確的方向指出我如何處理這種情況?

非常感謝!

+1

[鏈接](http://www.mrsoundless.com/php/ yii/search-and-sorting-a-column-from-a-related-table-in-a-cgridview /#comment-4939) – msoa

+0

這太好了,如果你只是檢索一條記錄,但我不是, m得到一組CActiveRecords,每個我需要'文本'字段。 – user1357063

+0

你說你想在一列中添加tag.text,這是否意味着可以爲同一個問題提供多行(帶有多個標籤)?這將決定您是否需要序列化標記以進行顯示(以及可能的搜索)。 – PrplHaz4

回答

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