Как преобразовать массив объектов данных модели в 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)'),
);
}
Ответы
Ответ 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