如何将模型数据对象数组转换为dataProvider

pra*_*132 12 php model yii dataprovider

假设我的模型User与自身有多对多的关系,命名为friends.所以$user->friends(或$model->friends在视图中)给我一个User对象数组.我想将朋友显示为gridview.但CGridView数据作为dataProvider对象.谷歌搜索找到了将模型对象数组转换为dataProvider对象的方法,如下所示.

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'gridUser',
    'dataProvider' => new CArrayDataProvider($model->friends, array()),
));
Run Code Online (Sandbox Code Playgroud)

现在使用这个我得到一个错误

属性"User.id"未定义.

UPDATE

public function relations()
{
    return array(
         'friends' => array(self::MANY_MANY, 'User', 'friendship(user_id, friend_id)'),
    );
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*goo 18

我使用两个阶段构建下面显示的提供程序.但我发现它在分页方面给你带来了麻烦.因为我正在做其他事情,所以我没有费心去解决这个问题

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

话虽如此,您的代码应该可以工作(请参阅下面的API文档示例).我怀疑你的关系中的属性比提供的代码错误.如果可以,请重新检查关系定义

来自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,
    ),
));
Run Code Online (Sandbox Code Playgroud)

  • 太棒了,我帮忙:) (2认同)

pra*_*132 13

得到它:),我可以使用CActiveDataProvider而不是CArrayDataProvider如下给出

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

无论如何感谢@Stefano的回复

  • 这是一个更好的答案,因为它使CGridView能够从CModel获取网格标题... (4认同)