7

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

假设学生有很多课程。

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

像这样的东西:

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

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

是否有捷径可寻?或者我是否必须在课程模型上创建一个搜索条件,其中一些条件是手动从学生模型中获取的?

4

2 回答 2

13
  1. 课程结束后去掉括号

  2. 使用数组数据提供者

    $this->widget('zii.widgets.grid.CGridView', array(
      'dataProvider' => new CArrayDataProvider($model->courses, array()),
      'columns'=>array(
        'name',
      ), 
    ));
    
于 2011-04-13T16:31:52.747 回答
0

有几件事要开始:

  1. 我认为应该$model->courses代替$model->courses()
  2. 无论如何都不起作用的原因是 Yii 的 AR 关系返回一个对象数组,而不是实际的 DataProvider 对象

无论如何,我似乎也记得为此而苦苦挣扎。我从来没有真正让它像我想要的那样工作。我得到的最接近的是在我的 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 关系。我希望这会有所帮助,即使我确定这不是您想要做的。如果有人有更好的解决方案,请分享!我也想了解一下!:)

于 2011-04-13T15:31:29.203 回答