Отношения между субъектами и студентами MANY_MANY, но вы написали это немного неправильно, это то, что вам нужно:
class Subjects extends CActiveRecord
{
// ...
public function relations()
{
return array(
'Students'=>array(self::MANY_MANY, 'Students', 'Students_taken_Subjects(Subject_ID, Student_ID)'),
);
}
// ...
}
После того как вы» ve написал это отношение, активная запись 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;
// ...
вы не получите другой DB вызова каждый потому что Yii уже загрузил данные.
Вам нужно будет предоставить более подробную информацию о том, что вы хотите делать со студентами в поставщике данных, прежде чем я могу дать более подробную информацию об этом.