web-dev-qa-db-ja.com

モデルデータオブジェクト配列をdataProviderに変換する方法

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)'),
    );
}
12
prashu132

以下に示すプロバイダーを構築する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,
    ),
));
18
Stefano Mtangoo

了解しました:)、以下に示すように、CActiveDataProviderの代わりにCArrayDataProviderを使用できます

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'gridUser',
    'dataProvider' => new CActiveDataProvider('User', array(
            'data'=>$model->friends,
    )),
    //...... columns display list.....
));

とにかく返信ありがとう@Stefano

13
prashu132