User
という名前のそれ自体と多対多の関係を持つモデルfriends
があるとします。そう $user->friends
(または$model->friends
in view)は、User
オブジェクトの配列を提供します。友達をグリッドビューとして表示したかったのです。ただし、CGridView
データはdataProvider
オブジェクトとして。それをグーグルで検索すると、以下に示すように、モデルオブジェクトの配列をdataProvider
オブジェクトに変換する方法が見つかりました。
$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'gridUser',
'dataProvider' => new CArrayDataProvider($model->friends, array()),
));
これを使用するとエラーが発生します
プロパティ「User.id」が定義されていません。
更新
public function relations()
{
return array(
'friends' => array(self::MANY_MANY, 'User', 'friendship(user_id, friend_id)'),
);
}
以下に示すプロバイダーを構築する2段階を使用します。しかし、ページネーションの面で問題が発生することがわかりました。私は他のことをしているので、その問題を解決することを気にしませんでした
$dataProvider = new CArrayDataProvider('User');
$dataProvider->setData($model->friends);
$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'gridUser',
'dataProvider' =>$dataProvider,
));
そうは言っても、コードは機能するはずです(APIドキュメントの以下の例を参照してください)。提供されたコードよりも、リレーションに間違った属性があると思われます。問題がない場合は、リレーション定義を再確認してください
From Yii docs:
$rawData=Yii::app()->db->createCommand('SELECT * FROM tbl_user')->queryAll();
// or using: $rawData=User::model()->findAll(); <--this better represents your question
$dataProvider=new CArrayDataProvider($rawData, array(
'id'=>'user',
'sort'=>array(
'attributes'=>array(
'id', 'username', 'email',
),
),
'pagination'=>array(
'pageSize'=>10,
),
));
了解しました:)、以下に示すように、CActiveDataProvider
の代わりにCArrayDataProvider
を使用できます
$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'gridUser',
'dataProvider' => new CActiveDataProvider('User', array(
'data'=>$model->friends,
)),
//...... columns display list.....
));
とにかく返信ありがとう@Stefano