Как преобразовать массив объектов данных модели в 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)'),
);
}
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,
),
));
Понял:), я могу использовать CActiveDataProvider
вместо CArrayDataProvider
, как указано ниже
$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'gridUser',
'dataProvider' => new CActiveDataProvider('User', array(
'data'=>$model->friends,
)),
//...... columns display list.....
));
В любом случае спасибо за ответ @Stefano