2

我有 2 张桌子(学生和员工)

student(reg_no , s_name, dept, f_name) reg_no 是主键 employee(e_no,design,salary,reg_no) reg_no 是外键参考 student(reg_no)。

我想显示来自员工的 e_no、design 和来自学生表的 s_name、dept。所以我完整的 cgridview 将是

e_no,设计,s_name,部门

我的员工/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',
    ),

),
));
?>

我的 searchEmployees() 的 model/employee.php 代码

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

谢谢

4

1 回答 1

4

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

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

Employee.e_no, Employee.design,Student.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->relations() 方法中定义的 Employee 模型的关系的名称。另请查看列上的CGridView 文档以获取有关其工作原理的更多信息。

更新:您可以轻松切换此 CGridView 实例化的方法以使用 anEmployee而不是 aStudent并通过更改 columns 数组仍然显示相同的信息。

更新 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。也许您有 Student 一个等效的 Employee 模型,这可能是错误的原因。我希望以上内容可以帮助您解决它。

于 2012-11-08T19:52:45.543 回答