2

私は2つのテーブル(学生と従業員)を持っています

student(reg_no , s_name, dept, f_name) reg_no は主キーの employee(e_no,design,salary,reg_no) です。reg_no は外部キー参照の student(reg_no) です。

employee から e_no,design を、student テーブルから s_name,dept を表示したい。だから私の完全な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',
    ),

),
));
?>

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 HELP.

ありがとう

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_noEmployee.designStudent.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 のドキュメントも確認してください。

更新:この 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 を返します。おそらく、Students に同等の Employee モデルがあり、それがエラーの原因である可能性があります。上記が解決に役立つことを願っています。

于 2012-11-08T19:52:45.543 に答える