How to convert model data objects array to dataProvider

23,796

Solution 1

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,
    ),
));

Solution 2

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

Share:
23,796
Prashanth Shyamprasad
Author by

Prashanth Shyamprasad

A software engineer who have worked on RubyOnRails &amp; PHP earlier, currently working on Java with Spring Boot, JPA, EmberJS, ReactJS etc.

Updated on July 05, 2022

Comments

  • Prashanth Shyamprasad
    Prashanth Shyamprasad almost 2 years

    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)'),
        );
    }
    
  • Prashanth Shyamprasad
    Prashanth Shyamprasad over 11 years
    got the exact thing i was searching, anyways thanks dude. thumbs up to your answer too.
  • Prashanth Shyamprasad
    Prashanth Shyamprasad over 11 years
    the exact answer that i was searching is given below. please check it and upvote if its useful
  • Stefano Mtangoo
    Stefano Mtangoo over 11 years
    Great that I was of help :)
  • Prashanth Shyamprasad
    Prashanth Shyamprasad over 11 years
    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 not
  • Stefano Mtangoo
    Stefano Mtangoo over 11 years
    its nice and efficient solution I can think of. So no need to worry!
  • Gero
    Gero about 11 years
    this is a better answer, as it enables CGridView to fetch grid headers from the CModel...
  • Xavier John
    Xavier John over 10 years
    How to get rid of 'Displaying 1-2 of 6 results.' like text that shows up above the grid?