2011-04-13 15 views
7

Ho un modello con has_many association.Utilizzo di CGridView per l'associazione di un modello

Diciamo solo che lo studente ha molti corsi.

Mi piacerebbe mostrare tutti i corsi di uno studente particolare utilizzando CGridView.

Qualcosa di simile a questo:

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

cercato anche new CActiveDataProvider($model->courses) come dataProvider ma ancora non funzionerà.

C'è un modo semplice per farlo? O devo creare un criterio di ricerca sul modello di corso con alcuni criteri presi dal modello studente manualmente?

risposta

13
  1. Sbarazzarsi delle parentesi dopo corsi

  2. Utilizzare un arraydataprovider

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

Funziona! Grazie! – Engwan

0

Un paio di cose per iniziare:

  1. penso che dovrebbe essere $model->courses invece di $model->courses()
  2. La ragione che non funziona in ogni caso è che le relazioni AR di Yii restituiscono un array di oggetti, non un oggetto DataProvider attuale

In ogni caso, mi sembra di ricordare anche di lottare con questo. Non l'ho mai davvero fatto funzionare come volevo. Il più vicino che ho ottenuto era impostare la variabile "data" nel mio dataProvider, ma poi il paging era rotto nel mio ListView. Ha funzionato qualcosa di simile:

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

Quello che ho finito per fare è stato la creazione di nuovi criteri di passare al mio DataProvider che ha fatto la stessa cosa come il rapporto. Così:

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

Suppongo che si stia utilizzando una relazione MANY_MANY con una tabella di join. Spero che questo aiuti, anche se sono sicuro che non è proprio quello che vuoi fare. Se qualcuno ha una soluzione migliore per favore condividi! Voglio saperne anche a me! :)

Problemi correlati