2011-04-13 18 views
7

Tengo un modelo con asociación has_many.Uso de CGridView para la asociación de un modelo

Digamos que el alumno tiene muchos cursos.

Me gustaría mostrar todos los cursos de un alumno en particular utilizando CGridView.

Algo como esto:

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

también intentó new CActiveDataProvider($model->courses) como dataProvider pero todavía no trabajará.

¿Hay una manera fácil de hacer esto? ¿O tengo que crear un criterio de búsqueda en el modelo del curso con algunos criterios tomados del modelo de estudiante manualmente?

Respuesta

13
  1. deshacerse de los paréntesis después de los cursos

  2. Utilice un arraydataprovider

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

Funciona! ¡Gracias! – Engwan

0

Un par de cosas para empezar:

  1. Creo que debe ser $model->courses en lugar de $model->courses()
  2. La razón de que no funciona de todos modos es que las relaciones AR de Yii devuelven un conjunto de objetos, no una objeto DataProvider real

De todos modos, parece que recuerdo haber luchado con esto también. Nunca conseguí que funcionara como yo quería. Lo más parecido que conseguí fue establecer la variable 'data' en mi dataProvider, pero luego la búsqueda se rompió en mi ListView. Se trabajó algo como esto:

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

Lo que terminé haciendo fue la creación de nuevos criterios para pasar a mi DataProvider que hizo lo mismo que la relación. De este modo:

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

Estoy asumiendo que usted está utilizando una relación MANY_MANY con una tabla de unión. Espero que esto ayude, aunque estoy seguro de que no es exactamente lo que quieres hacer. Si alguien tiene una mejor solución, ¡por favor comparte! ¡Quiero aprender sobre eso también! :)

Cuestiones relacionadas