Как преобразовать массив объектов данных модели в dataProvider


Предположим, что у меня есть модель User, которая имеет отношение "многие ко многим" к себе, названная friends. итак, $user->friends (или $model->friends в представлении) дает мне массив объектов User. Я хотел отобразить друзей в виде сетки. Но CGridView данные как dataProvider объект. Поиск в Google для этого нашел способ преобразовать массив объектов модели в объект 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)'),
    );
}
Author: Kai, 2013-01-03

2 answers

Я использую двухэтапное построение провайдера, показанного ниже. Но я обнаружил, что это доставляет вам проблемы с точки зрения разбивки на страницы. Я не потрудился решить эту проблему, так как занимаюсь другими делами

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

При этом ваш код должен работать (см. Пример ниже из документов API). Я подозреваю, что в ваших отношениях есть неправильный атрибут, чем указанный код. Перепроверьте определение отношения, если оно в порядке

Из документов Yii:

$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
Author: Stefano Mtangoo, 2013-01-03 10:13:03

Понял:), я могу использовать CActiveDataProvider вместо CArrayDataProvider, как указано ниже

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

В любом случае спасибо за ответ @Stefano

 13
Author: prashu132, 2013-01-10 10:02:42