Реализовать связь многие ко многим в Yii

Добрый день! Сегодня рассмотрим способ организации связи таблиц многие ко многим на Yii.

Допустим у нас есть таблица профилей пользователей и таблица категорий интересов и увлечений. Один пользователь может иметь несколько увлечений и одним увлечением может интересоваться несколько пользователей, таким образом у нас получается связь многие ко многим. 

example many to many

Реализация связи многие ко многим в MySQL производится через ассоциативную таблицу, поскольку непосредственную связь данная СУБД не поддерживает. Поэтому создаем еще одну таблицу для связи.

многие ко многим Yii

Далее необходимо создать модели этих таблиц, это можно сделать при помощи 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

Допустим мы решили записывать время, когда у пользователя появилось новое увлечение, тогда наша схема слегка изменится.

many_many yii

Представим, что сейчас мы хотим получить не только чем интересуется данный пользователь а еще и время, когда он начал этим интересоваться. В таком случае реализуем следующую связь в модели таблицы 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
При копировании материалов обратная ссылка на play-stop.ru желательна обязательна!