我有 2 张 table (学生和员工)
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,设计,s_name,部门
我的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',
),
),
));
?>
我的 model/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”未定义。
如何解决错误请帮助。
谢谢
最佳答案
您可以使用 CActiveRecord->getRelated 配置 cgridview 显示相关记录的信息在您的列自定义中...如下所示:
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->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',
),
通过对 'columns'
中成员的 'value'
字段进行调整,每当模型尝试访问相关模型时,我们都会显示一条小消息。 getRelated()
返回相关记录,如果未找到,则返回 null。也许您的 Students 有一个等效的 Employee 模型,这可能是错误的原因。希望以上内容能帮助您解决问题。
关于yii - YII 中的 CGRIDVIEW 两表数据显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13288723/