2011-04-13 43 views
7

我有has_many關聯的模型。使用CGridView模型的關聯

讓我們只說學生有很多課程。

我想使用CGridView顯示特定學生的所有課程。

事情是這樣的:

$this->widget('zii.widgets.grid.CGridView', array(             
    'dataProvider' => $model->courses,                
    'columns'=>array(                                           
    'name',                                             
),                         
)); 

也試過new CActiveDataProvider($model->courses)作爲dataProvider,但仍然無法正常工作。

有沒有簡單的方法來做到這一點?還是必須在課程模型中創建一個搜索條件,並且手動從學生模型中獲取一些條件?

回答

13
  1. 獲取課程後去掉括號

  2. 使用arraydataprovider

    $this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider' => new CArrayDataProvider($model->courses, array()), 
        'columns'=>array(
        'name', 
    ), 
    )); 
    
+0

它的工作原理!謝謝! – Engwan 2011-04-14 02:32:33

0

有幾件事情,開始:

  1. 我覺得應該是$model->courses而不是$model->courses()
  2. 不反正工作是Yii中的AR關係返回對象的數組,而不是原因實際的DataProvider對象

無論如何,我似乎還記得與此一起努力。我從來沒有像我想要的那樣工作。我得到的最接近的是在dataProvider中設置'data'變量,但是在我的ListView中分頁被破壞了。它的工作是這樣的:

$dataProvider=new CActiveDataProvider('Course', array(
    'data'=>$model->courses, 
)); 

我最終什麼事做的是創造新的標準,在傳遞給我的dataProvider中做同樣的事情的關係。像這樣:

$criteria=new CDbCriteria; 
$criteria->join = "JOIN student_course_relation_table sc ON sc.course_id = t.id"; 
$criteria->compare('sc.student_id',$model->id); 
$dataProvider=new CActiveDataProvider('Course', array(
    'criteria'=>$model->courses, 
)); 

我假設您正在使用連接表的MANY_MANY關係。我希望這會有所幫助,儘管我確信它不是你想要的。如果有人有更好的解決方案,請分享!我也想了解它! :)