使用CGridView进行模型的关联

时间:2011-04-13 09:38:51

标签: yii relationships

我有一个带有has_many关联的模型。

我们只想说学生有很多课程。

我想使用CGridView显示特定学生的所有课程。

这样的事情:

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

还尝试new CActiveDataProvider($model->courses)作为dataProvider,但仍无法正常工作。

有一种简单的方法吗?或者我是否必须在课程模型上创建一个搜索条件,并手动从学生模型中获取一些标准?

2 个答案:

答案 0 :(得分:13)

  1. 在课程

  2. 之后删除括号
  3. 使用arraydataprovider

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

答案 1 :(得分:0)

开始时要做的一些事情:

  1. 我认为它应该是$model->courses而不是$model->courses()
  2. 无论如何都不起作用的原因是Yii的AR关系返回一个对象数组,而不是一个实际的DataProvider对象
  3. 无论如何,我似乎记得也在努力解决这个问题。我从来没有像我想要的那样真正地工作。我得到的最接近的是在我的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关系。我希望这会有所帮助,即使我确定这不是你想要做的。如果有人有更好的解决方案请分享!我也想了解它! :)