7

has_many 関連付けを持つモデルがあります。

Student には多くのコースがあるとしましょう。

CGridView を使用して、特定の学生のすべてのコースを表示したいと思います。

このようなもの:

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

またnew CActiveDataProvider($model->courses)、dataProvider として試してみましたが、まだ機能しません。

これを行う簡単な方法はありますか?または、学生モデルから手動で取得したいくつかの基準を使用して、Course モデルで検索基準を作成する必要がありますか?

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 で「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 関係を使用していると仮定しています。あなたがやりたいことではないことは確かですが、これがお役に立てば幸いです。誰かがより良い解決策を持っている場合は、共有してください! 私もそれについて学びたいです!:)

于 2011-04-13T15:31:29.203 に答える