Добрый день! Сегодня рассмотрим способ организации связи таблиц многие ко многим на Yii.
Допустим у нас есть таблица профилей пользователей и таблица категорий интересов и увлечений. Один пользователь может иметь несколько увлечений и одним увлечением может интересоваться несколько пользователей, таким образом у нас получается связь многие ко многим.
Реализация связи многие ко многим в MySQL производится через ассоциативную таблицу, поскольку непосредственную связь данная СУБД не поддерживает. Поэтому создаем еще одну таблицу для связи.
Далее необходимо создать модели этих таблиц, это можно сделать при помощи Gii.
Реализация связи MANY_MANY
Допустим мы хотим получить все категории, к которым относится определенный пользователь. Заходим в модель таблицы tbl_profile и создаем связь с моделью таблицы tbl_categ типа MANY_MANY.
public function relations() { return array( 'many-many'=>array(self::MANY_MANY, 'Categ', 'prof_categ(id_prof, id_categ)'), ); }
В данной связи MANY_MANY хотелось бы пояснить следующее:
‘Categ ‘ — является моделью таблицы tbl_categ
prof_categ(id_prof, id_categ) — здесь prof_categ указывает на таблицу prof_categ, а не на модель! Параметрами являются внешние ключи, первый параметр всегда указывает на первичный ключ текущей таблицы, а второй на первичный ключ связываемой.
$ctg=Profile::model()->with('many-many')->findByPk('1'); print_r($ctg->categ);
Так мы получим массив объектов Categ по данному пользователю, что нам и требовалось получить. Этот способ хорош в том случае, если нам не нужно получать данные из самой связующей ассоциативной таблицы yii.
Реализация связи MANY_MANY через trough
Допустим мы решили записывать время, когда у пользователя появилось новое увлечение, тогда наша схема слегка изменится.
Представим, что сейчас мы хотим получить не только чем интересуется данный пользователь а еще и время, когда он начал этим интересоваться. В таком случае реализуем следующую связь в модели таблицы tbl_profile.
public function relations() { return array( //указываем внешний ключ в связываемой таблице 'Prof_Categ'=> array(self::HAS_MANY, 'ProfCateg', 'id_prof'), 'Categ'=> array(self::HAS_MANY, 'Categ', 'id_categ', 'through' =>'Prof_Categ'), ); }
В данном случае связь многие ко многим в yii мы представили как две связи один ко многим. Сначала мы указали связь таблицы tbl_rofile с prof_categ через внешний ключ id_prof, а затем связь с таблицей tbl_categ через связь Prof_Categ. through указывает на связь, через которую предполагается связывание таблиц.
$ctg=Profile::model()->with('Categ')->findByPk('1'); //выведет массив объектов categ, удовлетворяющих условию print_r($ctg->сateg); //выведет массив объектов ProfCateg, удовлетворяющих условию print_r($ctg->ProfCateg);
Теперь мы можем обратиться к любой из трех моделей и получить связанный данные.
Поэтому реализовывая связь многие ко многим в Yii через through, вы получаете больше информации, в частности данные из связующей таблицы. Если же в связующей таблице находятся только данные для связи таблиц и они не составляют для вас интереса, то можно использовать связь MANY_MANY.
Всего доброго!
comments powered by HyperComments