我有这样的数据库
==== Group =====
id
name
==== Member ====
id
group_id
firstname
lastname
现在我可以使用multimodel在组控制器中使用成员成员的表属性。 由于我已经完成了多模型,因此我可以轻松地从单个视图页面对两个模型进行创建更新删除。现在我的问题是当我要在Group的管理视图文件中同时使用两个模型时,我必须在CGridView中显示这两个文件以在网格中显示。但我的问题是在CGridView中只能看到第一个模型。我希望第二个模型能够在CGridView上显示。那怎么办呢?
答案 0 :(得分:4)
我认为您需要使用Relational Active Record组合模型。 在我正在学习的自学过程中,我希望我很快会有一个例子在这里发表...
编辑最后,我找到了一个例子。我(也许)在Yii中发现了一个错误,所以什么是一个简单的任务,需要的时间比必要的多...
我有两个型号,User e Persona,从gii获得,以前不相关。然后我将Persona添加到User作为可选属性:在User.php中
/**
* @return array relational rules.
*/
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'persona' => array(self::HAS_ONE,'Persona','id')
);
}
然后,当绑定到CGridView时,User的模型会自动显示Persona中的选定字段:
<hr><?php
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider' => new CActiveDataProvider('User'),
'columns' => array(
'username',
'password',
'email',
'persona.indirizzo'
),
));
?>
我发现的错误(可能需要调查更多):我的Persona模型的名称中有一个带有重音字符的属性,如果我使用它,我会收到一个错误:即如果
'columns' => array(
'username',
'password',
'email',
'persona.identità'
),
然后页面无法实例化:
The column must be specified in the format of "Name:Type:Label", where "Type" and "Label" are optional.
/home/carlo/public/yii-1.1.8.r3324/framework/zii/widgets/grid/CGridView.php(332)
320 foreach($this->columns as $column)
321 $column->init();
322 }
323
324 /**
325 * Creates a {@link CDataColumn} based on a shortcut column specification string.
326 * @param string $text the column specification string
327 * @return CDataColumn the column instance
328 */
329 protected function createDataColumn($text)
330 {
331 if(!preg_match('/^([\w\.]+)(:(\w*))?(:(.*))?$/',$text,$matches))
332 throw new CException(Yii::t('zii','The column must be specified in the format of "Name:Type:Label", where "Type" and "Label" are optional.'));
333 $column=new CDataColumn($this);
334 $column->name=$matches[1];
我认为这是不匹配的正则表达式......
答案 1 :(得分:0)
如果将groupId和groupName的getter添加到Member模型,则可以轻松显示成员的gridview并包含其组数据。这不是一个非常干净的解决方案,但它是最简单的。
答案 2 :(得分:0)
在组模型中定义一些类似'getGroupNameById'的函数,然后按如下方式调用它
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider, //for members model
'columns'=>array(
'id',
'firstName',
'lastName',
array(
'name'=>'groupName'
'value'=>'getGroupNameById($data->group_id)',
//$data is members row accessible in gridview
),
),
));