我面临着使用Yii关系从表中获取记录的问题,
我有3张桌子
1)学生 - > ID,名称,Roll_Number
2)受试者 - > ID,名称
3)Students_taken_Subjects - > ID,Student_ID,Subject_ID
假设有多个学生已经考虑了多个科目,这些科目存储在第3个表格“Students_taken_Subjects”中,那么我如何能够取出任何特定科目的学生名单?
e.g。学生数学列表
以下关系中哪一个是正确的,如何将结果输入$ dataProvider变量?
'Students'=>array(self::HAS_MANY, 'Subjects', 'Student_ID'),
和
return array(
'Students'=>array(self::MANY_MANY, 'Subjects',
'Students_taken_Subjects(student_id, subject_id)'),
);
答案 0 :(得分:1)
主题和学生之间的关系是MANY_MANY,但你写的有点不对,这就是你需要的:
class Subjects extends CActiveRecord
{
// ...
public function relations()
{
return array(
'Students'=>array(self::MANY_MANY, 'Students', 'Students_taken_Subjects(Subject_ID, Student_ID)'),
);
}
// ...
}
一旦你写了这个关系,主题活动记录就会有一个学生属性,它返回一个数组,其中有0个或更多学生就读这个主题。您可以像这样访问它们:
$subject = Subjects::model()->findByPk($pk);
$students = $subject->Students; // an array with the subject's students
以上代码将导致两次数据库访问,一次用于$ subject,另一次用于相关的$ students。这可能没什么问题,但是如果你正在访问很多主题,它可能会成为一个太多“延迟加载”的问题。你可以告诉Yii“急切地”加载学生以及这样的科目:
$subjects = Subjects::model()->with('Students')->findAll();
在这里你找到了所有的科目,但警告Yii - 使用('学生') - 你也想要每个科目的学生信息。这样可以确保所有与您找到的科目相关的学生都能立即获得。 with()
函数的替代方法是使用条件的with
属性:
$criteria=new CDbCriteria;
$criteria->with = array('Students');
$subjects = Subjects::model()->findAll($criteria);
无论哪种方式,当你确实要求学生这样的学生时:
$subjects[0]->Students;
$subjects[1]->Students;
// ...
每次都不会再获得另一个数据库调用,因为Yii已经加载了数据。
在我提供有关该数据的更多详细信息之前,您需要提供有关您希望与数据提供商中的学生做些什么的更多详细信息。