使用CGridView模型的关联

问题描述:

我有has_many关联的模型。使用CGridView模型的关联

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

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

事情是这样的:

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

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

有没有简单的方法来做到这一点?还是必须在课程模型中创建一个搜索条件,并且手动从学生模型中获取一些条件?

  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

有几件事情,开始:

  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关系。我希望这会有所帮助,尽管我确信它不是你想要的。如果有人有更好的解决方案,请分享!我也想了解它! :)