0

我有两个表,我需要过滤这两个表数据并将其放入 gridview。我使用这样的连接两个表

         $student=new Student;
         $marks=new AssimentMarks;

        $criteria_st=new CDbCriteria;
        $criteria=new CDbCriteria;

        $criteria->select    = 't.st_id,t.st_name,stu.ass_id,stu.marks_cr1,stu.marks_cr2,stu.marks_cr3,stu.marks_cr4,stu.marks_cr5';
        $criteria->join      = 'INNER JOIN assiment_marks stu ON stu.st_id=t.st_id';
        $criteria->condition = 'stu.ass_id=:ass_id';
        $criteria->params    = array(':ass_id'=>Yii::app()->session['modelcrite']['ass_id']);
        $criteria->addInCondition('t.st_id', $studentid);

return new CActiveDataProvider($student, array('criteria'=>$criteria,));

但在 gridviwe 中只显示学生数据库值。它显示为。如何将两个模型传递给 CActiveDataProvider ?

这就是数据显示的方式 http://i.stack.imgur.com/Kogjz.jpg

4

1 回答 1

3

1) 架构中的外键

您的 assiment 表应该使用外键引用您的学生表,如下所示(假设 SQLite):

CREATE TABLE student (
    id INTEGER PRIMARY KEY,
    name TEXT
);

CREATE TABLE assiment_record(  
    id INTEGER PRIMARY KEY,
    student_id INTEGER,
    cr1 INTEGER,
    cr2 INTEGER,
    cr3 INTEGER,
    cr4 INTEGER,
    cr5 INTEGER,
    FOREIGN KEY( student_id ) REFERENCES student(id)   -- FK goes in the CHILD table. 
);

2) 使用 Gii 生成模型:

学生 -> 模型/Student.php

assiment_record -> 模型/AssimentRecord.php

Gii 很聪明,会猜测你的关系:

// AssimentRecord.php looks good! No changes made!
public function relations()
return array(
    'student' => array(self::BELONGS_TO, 'Student', 'student_id'),
);

归属记录属于学生

3) 调整 gii 的输出 (Student.php)

但是Gii的并不完美,也不知道你的意图是什么。当前的学生关系(HAS_MANY)返回一个数组,但我不想处理这个数组(因为我很懒!),所以我把它改成一个HAS_ONE-relation:

// Student.php
public function relations()
{
    return array(
    // Change this:   'assimentRecords' => array(self::HAS_MANY, 'AssimentRecord', 'student_id'),
    /* into this: */  'assimentRecord'  => array(self::HAS_ONE,  'AssimentRecord', 'student_id'),
    );
}

学生有一个 assiment 记录

4) 显示网格:

// views/site/index.php  (Or wherever.)
$dataProvider = new CActiveDataProvider( 'Student' );
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns' => array(
        'id',
        'name',
        'assimentRecord.cr1',
        'assimentRecord.cr2',
        'assimentRecord.cr3',
        'assimentRecord.cr4',
        'assimentRecord.cr5',
    )
));
于 2013-06-07T01:45:02.463 回答