我有2张桌子(学生和员工)
student(reg_no,s_name,dept,f_name)reg_no是主键 employee(e_no,design,salary,reg_no)reg_no是外键参考学生(reg_no)。
我想显示e_no,来自员工的设计 和s_name,来自学生表的部门。 所以我的完整cgridview将是
e_no,design,s_name,dept
我的employee / admin.php代码
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'employee-grid',
'dataProvider'=>$model->searchEmployees(),
//'filter'=>$model,
'columns'=>array(
'e_no',
'e_name',
'design',
'salary',
'reg_no',
array('name'=>'student.s_name', 'value'=>'$data->student->s_name'), // student name
'salary', // employee.salary
array(
'class'=>'CButtonColumn',
),
),
));
?>
我的search / employee.php代码,用于searchEmployees()
public function searchEmployees()
{
$criteria=new CDbCriteria;
$criteria->alias = 'i';
$criteria->compare('e_no',$this->e_no);
$criteria->compare('e_name',$this->e_name,true);
$criteria->compare('design',$this->design,true);
$criteria->compare('salary',$this->salary);
$criteria->compare('reg_no',$this->reg_no);
$criteria->join= 'JOIN student d ON (i.reg_no=d.reg_no)';
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
'sort'=>array(
'defaultOrder'=>'reg_no ASC',
),
));
}
但我面对错误
未定义属性“Employee.studentname”。
如何解决错误PLZ帮助。
感谢
答案 0 :(得分:4)
您可以配置cgridview以在您的自定义列中使用CActiveRecord->getRelated显示相关记录的信息...它如下所示:
student(reg_no,s_name,dept,f_name)将是模型Student
。
employee(e_no,design,salary,reg_no)将是模型Employee
。
Employee.e_no
,Employee.design
,Student.s_name
和Student.dept
是您想要的值,因此您的列数组应为:
<?php
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'student-grid',
'dataProvider'=>Student::model()->search(),
//'filter'=>$model,
'columns'=>array(
array(
'header'=>Employee::model()->getAttributeLabel('e_no'), //column header
'value'=>'$data->getRelated('employee')->e_no', //column name, php expression
'type'=>'raw',
),
array(
'header'=>Employee::model()->getAttributeLabel(\'design\'), //column header
'value'=>'$data->getRelated(\'employee\')->design', //column name, php expression
'type'=>'raw',
),
's_name',
'dept',
),
));
?>
注意相关记录数据是如何在自定义列的“值”规范中完成的,并且getRelated()的参数是为Student-&gt; relations()中定义的Employee模型定义的关系的名称方法。另请在列上查看CGridView documentation,了解有关其工作原理的详细信息。
更新:您可以轻松切换此CGridView实例化的方法,以使用Employee
而不是Student
,并通过更改列数组仍然显示相同的信息。
更新2:您可以轻松处理列数组中的非现有关系:
'columns'=>array(
array(
'header'=>Employee::model()->getAttributeLabel('e_no'), //column header
'value'=>'($data->getRelated(\'employee\')=== null)?'No related employee registry':$data->getRelated('employee')->e_no', //column name, php expression
'type'=>'raw',
),
array(
'header'=>Employee::model()->getAttributeLabel(\'design\'), //column header
'value'=>'($data->getRelated(\'employee\')=== null)?'No related employee registry':$data->getRelated(\'employee\')->design', //column name, php expression
'type'=>'raw',
),
's_name',
'dept',
),
在'value'
中我们成员的'columns'
字段中进行此调整时,只要模型尝试访问相关模型,我们就会显示一条小消息。 getRelated()
返回相关记录,如果没有找到则返回null。也许你有学生一个等效的员工模型,这可能是错误的原因。我希望上面有助于你解决它。