12

假设我有一个模型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()),
));

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

未定义属性“User.id”。

更新

public function relations()
{
    return array(
         'friends' => array(self::MANY_MANY, 'User', 'friendship(user_id, friend_id)'),
    );
}
4

2 回答 2

18

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

$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,
    ),
));
于 2013-01-03T10:13:03.450 回答
13

明白了:),我可以使用CActiveDataProvider而不是CArrayDataProvider如下所示

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

无论如何感谢@Stefano的回复

于 2013-01-10T10:02:42.703 回答