2012-01-17 4 views
0

я перед проблемой для извлечения из записей из таблицы, используя Yii отношения,Как извлечь из сложного результата из базы данных - Yii

У меня есть 3 таблицы

1) Студенты -> ID, Имя, Roll_Number

2) Субъекты -> ID, имя

3) Students_taken_Subjects -> ID, student_id, subject_id

Предположим, что есть число студентов есть взятых более чем на одну тему, которые хранятся в 3-й таблице «Students_taken_Subjects», то как я могу получить список студентов, взявших какой-либо конкретный предмет?

например. список студентов, занятых математикой

, который из нижеследующих отношений является правильным и как я могу получить результаты в переменную $ dataProvider?

'Students'=>array(self::HAS_MANY, 'Subjects', 'Student_ID'), 

и

return array(
'Students'=>array(self::MANY_MANY, 'Subjects', 
'Students_taken_Subjects(student_id, subject_id)'), 
); 

ответ

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)'), 
     ); 
    } 
    // ... 
} 

После того как вы» 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 уже загрузил данные.

Вам нужно будет предоставить более подробную информацию о том, что вы хотите делать со студентами в поставщике данных, прежде чем я могу дать более подробную информацию об этом.

Смежные вопросы