Php 如何将模型数据对象数组转换为数据提供程序

Php 如何将模型数据对象数组转换为数据提供程序,php,model,yii,dataprovider,Php,Model,Yii,Dataprovider,假设我有一个模型User,它与自身有多对多关系,命名为friends。 因此,$user->friends(或视图中的$model->friends)为我提供了一个用户对象数组。我想将好友显示为gridview。但是CGridView数据作为dataProvider对象。通过谷歌搜索找到了将模型对象数组转换为dataProvider对象的方法,如下所示 $this->widget('zii.widgets.grid.CGridView', array( 'id' => 'gr

假设我有一个模型
User
,它与自身有多对多关系,命名为
friends
。 因此,
$user->friends
(或视图中的
$model->friends
)为我提供了一个
用户
对象数组。我想将好友显示为gridview。但是
CGridView
数据作为
dataProvider
对象。通过谷歌搜索找到了将模型对象数组转换为
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)'),
    );
}

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

$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,
    ),
));
$rawData=Yii::app()->db->createCommand('SELECT*FROM tbl_user')->queryAll();
//或者使用:$rawData=User::model()->findAll();'用户',
'排序'=>数组(
'属性'=>数组(
“id”、“用户名”、“电子邮件”,
),
),
“分页”=>数组(
“页面大小”=>10,
),
));
明白了:),我可以使用
CActiveDataProvider
而不是
CArrayDataProvider
,如下所示

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

无论如何,感谢@Stefano

的回复,添加您如何定义关系以及两个模型(PK和FK)如何关联对于获得答案至关重要!我找到了我要找的东西,无论如何谢谢你,伙计。我也很赞成你的答案。下面给出了我正在搜索的确切答案。请检查并投票,如果它有用的话,我会很有帮助:)请检查下面给出的答案是否正确。我从中得到了要求的结果。我只是想知道这是一个更好的答案,还是一个我能想到的又好又有效的解决方案。所以不用担心!这是一个更好的答案,因为它使CGridView能够从CModel获取网格头。。。