Использование CGridView для ассоциации модели - PullRequest
7 голосов
/ 13 апреля 2011

У меня есть модель с ассоциацией has_many.

Скажем так, у студента много курсов.

Я бы хотел показать все курсы конкретного студента, используя CGridView.

Примерно так:

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

Также пробовал new CActiveDataProvider($model->courses) как dataProvider, но все равно не будет работать.

Есть ли простой способ сделать это?Или мне нужно создать критерии поиска на модели курса с некоторыми критериями, взятыми из модели студента вручную?

Ответы [ 2 ]

13 голосов
/ 13 апреля 2011
  1. Избавьтесь от скобок после курсов

  2. Используйте arraydataprovider

    $this->widget('zii.widgets.grid.CGridView', array(
      'dataProvider' => new CArrayDataProvider($model->courses, array()),
      'columns'=>array(
        'name',
      ), 
    ));
    
0 голосов
/ 13 апреля 2011

Несколько вещей для начала:

  1. Я думаю, это должно быть $model->courses вместо $model->courses()
  2. Причина, по которой все равно не работает, состоит в том, что AR-отношения Yii возвращают массив объектов, а не фактический объект DataProvider

Во всяком случае, я помню, что тоже боролся с этим. Я никогда не заставлял его работать так, как я хотел. Самое близкое, что я получил, - это установил переменную data в моем dataProvider, но затем в моем 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 с таблицей соединений. Я надеюсь, что это поможет, хотя я уверен, что это не совсем то, что вы хотите сделать. Если у кого есть лучшее решение, пожалуйста, поделитесь! Я тоже хочу узнать об этом! :)

...