2013-01-03 9 views
11

Userというモデルがあり、それ自体が多くの場合、friendsという名前に多くの関係があるとします。 だから$user->friends(または$model->friends)は私にUserのオブジェクトの配列を与えます。友達をgridviewとして表示したかったのです。しかし、CGridViewデータはdataProviderオブジェクトです。グーグルでは、以下のようにモデルオブジェクトの配列をdataProviderオブジェクトに変換する方法を発見しました。モデルデータオブジェクト配列をdataProviderに変換する方法

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'gridUser', 
    'dataProvider' => new CArrayDataProvider($model->friends, array()), 
)); 

今、これを使用して、私は

プロパティ "User.id" が定義されていないエラーを取得します。

UPDATE

public function relations() 
{ 
    return array(
     'friends' => array(self::MANY_MANY, 'User', 'friendship(user_id, friend_id)'), 
    ); 
} 
+0

あなたが関係をどのように定義し、2つのモデルがどのように関係しているか(PKとFK)を追加することは、答えを得るために不可欠です! –

答えて

18

Iは、以下に示すプロバイダを構築する二段階を使用しています。しかし、ページネーションの面で問題があることがわかりました。私は他のもの(APIドキュメントから以下の例を参照)、あなたのコードが動作するはずです言われていること

$dataProvider = new CArrayDataProvider('User'); 
$dataProvider->setData($model->friends); 
$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'gridUser', 
    'dataProvider' =>$dataProvider, 
)); 

をやっているので、その問題を解決するために困っていません。あなたの関係には、提供されたコードよりも間違った属性があると思われます。それはYiiのドキュメントから

OKであれば関係の定義を再確認してください:

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

以下に示すよう

$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, 
    ), 
)); 
+0

は私が探していた正確なものを得ました、とにかく感謝の男です。あなたの答えまであまりにも親指。 – prashu132

+0

私が探していた正確な答えは以下の通りです。それをチェックして、有用であればupvoteしてください – prashu132

+2

私は助けてくれました:) –

13

はそれを手に入れた:)、私はのためにとにかく感謝CActiveDataProviderの代わりCArrayDataProviderを使用することができます返信@Stefano

+4

これはCGridViewがCModelからグリッドヘッダをフェッチできるようにするので、これはより良い答えです... – Gero

関連する問題