How to convert model data objects array to dataProvider
Asked Answered
T

2

12

Suppose I have model User which have many to many relation to itself named as friends. so $user->friends (or $model->friends in view) gives me an array of User objects. I wanted to display the friends as gridview. But CGridView data as dataProvider object. Googling for it found the way to convert array of model objects to dataProvider object as given below.

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

Now using this I get an error

Property "User.id" is not defined.

UPDATE

public function relations()
{
    return array(
         'friends' => array(self::MANY_MANY, 'User', 'friendship(user_id, friend_id)'),
    );
}
Taejon answered 3/1, 2013 at 7:21 Comment(1)
adding how you defined relation and how two models relate (PK and FK) is crucial to getting an answer!Arnone
A
18

I use two stage building the provider shown below. But I found that it gives you trouble in terms of Pagination. I have not bothered to resolve that problem since am doing other things

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

That being said, your code should work (see the example below from API docs). I suspect there is wrong attribute in your relations than the provided code. Re-check the relation definition if it is ok

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,
    ),
));
Arnone answered 3/1, 2013 at 10:13 Comment(6)
got the exact thing i was searching, anyways thanks dude. thumbs up to your answer too.Taejon
the exact answer that i was searching is given below. please check it and upvote if its usefulTaejon
Great that I was of help :)Arnone
Please check if the below given answer is correct or not. I got the required result from that. I just want to know if its a better answer or notTaejon
its nice and efficient solution I can think of. So no need to worry!Arnone
How to get rid of 'Displaying 1-2 of 6 results.' like text that shows up above the grid?Maddock
T
13

Got it :) , i can use CActiveDataProvider instead of CArrayDataProvider as given below

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

Anyways thanks for the reply @Stefano

Taejon answered 10/1, 2013 at 10:2 Comment(1)
this is a better answer, as it enables CGridView to fetch grid headers from the CModel...Belford

© 2022 - 2024 — McMap. All rights reserved.