Yii 对模型使用CGridView';s协会

Yii 对模型使用CGridView';s协会,yii,relationships,Yii,Relationships,我有一个和你有很多联系的模特 让我们假设这个学生有很多课程 我想使用CGridView显示特定学生的所有课程 大概是这样的: $this->widget('zii.widgets.grid.CGridView', array( 'dataProvider' => $model->courses,

我有一个和你有很多联系的模特

让我们假设这个学生有很多课程

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

大概是这样的:

$this->widget('zii.widgets.grid.CGridView', array(                                                 
  'dataProvider' => $model->courses,                                                             
  'columns'=>array(                                                                                                                                                                            
    'name',                                                                                                                                                                                  
  ),                                                                                                 
));
$dataProvider=new CActiveDataProvider('Course', array(
  'data'=>$model->courses,
));
还尝试了
新的CActiveDataProvider($model->courses)
作为数据提供者,但仍然不起作用


有没有一个简单的方法可以做到这一点?或者我必须在课程模型上创建一个搜索条件,并手动从学生模型中获取一些条件?

首先要做几件事:

  • 我认为应该是
    $model->courses
    而不是
    $model->courses()
  • 不管怎么说,这都不起作用的原因是Yii的AR关系返回一个对象数组,而不是实际的DataProvider对象
  • 不管怎么说,我似乎还记得在这件事上挣扎过。我从来没有真正让它像我想要的那样工作过。我得到的最接近的结果是在我的dataProvider中设置“data”变量,但随后在我的ListView中分页被中断。它的工作原理如下:

    $this->widget('zii.widgets.grid.CGridView', array(                                                 
      'dataProvider' => $model->courses,                                                             
      'columns'=>array(                                                                                                                                                                            
        'name',                                                                                                                                                                                  
      ),                                                                                                 
    ));
    
    $dataProvider=new CActiveDataProvider('Course', array(
      'data'=>$model->courses,
    ));
    
    我最终做的是创建新的标准,以传递给我的数据提供者,该数据提供者做了与关系相同的事情。像这样:

    $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,
    ));
    
    我假设您正在使用连接表的多个关系。我希望这能有所帮助,尽管我确信这不是你想要做的。如果有人有更好的解决方案,请分享!我也想了解它!:)

  • 课程结束后去掉括号

  • 使用arraydataprovider

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