Отношения между предметами и студентами MANY_MANY, но вы написали это немного неправильно, это то, что вам нужно:
class Subjects extends CActiveRecord
{
// ...
public function relations()
{
return array(
'Students'=>array(self::MANY_MANY, 'Students', 'Students_taken_Subjects(Subject_ID, Student_ID)'),
);
}
// ...
}
Как только вы написали это отношение, активная запись Subjects будет иметь свойство Students, которое возвращает массив с 0 или более студентами, изучающими этот предмет. Вы можете получить к ним доступ так:
$subject = Subjects::model()->findByPk($pk);
$students = $subject->Students; // an array with the subject's 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 уже загрузил данные.
Вам нужно будет предоставить более подробную информацию о том, что вы хотите сделать со студентами в поставщике данных, прежде чем я смогу дать более подробную информацию об этом.