Как получить сложный результат из базы данных - Yii - PullRequest
0 голосов
/ 17 января 2012

У меня проблема с извлечением записей из таблицы с использованием отношения Yii,

у меня есть 3 стола

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

2) Предметы -> ID, Имя

3) Student_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 Ответ

1 голос
/ 04 февраля 2012

Отношения между предметами и студентами 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 уже загрузил данные.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...