Подтвердить что ты не робот

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

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

Ответ 1

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

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

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

Из документов 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,
    ),
));

Ответ 2

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

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

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