2013-01-03 128 views
11

假设我有模型User,它与自己有多对多的关系,命名为friends。 所以$user->friends(或$model->friends在视图中)给我一个User对象的数组。我想将这些朋友显示为gridview。但CGridView数据为dataProvider对象。使用Google搜索找到了将模型对象数组转换为dataProvider对象的方式,如下所示。如何将模型数据对象数组转换为数据提供者

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

现在用这个,我得到一个错误是没有定义

属性 “User.id”。

UPDATE

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

添加如何定义关系以及两个模型如何相关(PK和FK)对于获得答案至关重要! –

回答

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, 
    ), 
)); 
+0

得到了我正在寻找的确切的东西,反正感谢兄弟。也赞同你的回答。 – prashu132

+0

我正在寻找的确切答案在下面给出。请检查它并注意是否有用 – prashu132

+2

非常好,我有帮助:) –

13

明白了:),我可以使用CActiveDataProvider代替CArrayDataProvider下面

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

不管怎么说感谢给出回复@Stefano

+4

这是一个更好的答案,因为它使CGridView能够从CModel中获取网格头... – Gero