CGRIDVIEW在YII中显示两个数据显示

时间:2012-11-08 12:02:46

标签: yii

我有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帮助。

感谢

1 个答案:

答案 0 :(得分:4)

您可以配置cgridview以在您的自定义列中使用CActiveRecord->getRelated显示相关记录的信息...它如下所示:

student(reg_no,s_name,dept,f_name)将是模型Student。 employee(e_no,design,salary,reg_no)将是模型Employee

Employee.e_noEmployee.designStudent.s_nameStudent.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。也许你有学生一个等效的员工模型,这可能是错误的原因。我希望上面有助于你解决它。