@ColdSpirit

Правильно ли я сделал relations в yii?

Добрый день. Есть 3 таблицы, без внешних ключей.
1881441e6e32431c8a4f0fc173f6a254.PNG
Долго мучился с relations в yii, никак не мог понять, как связать их без FK. По идее хотел сделать связь many-many с обеих сторон для универсальности, но т.к. вывожу я все равно 1 категорию на страницу, решил что это лишнее, и сделал связь "одна категория - много страниц".

Вопросы такие:
  1. Не могу понять какого типа сделать связь с Pivot. Pages-Pivot скорее всего HAS_ONE, а вот с категориями как?
  2. Когда использую 'through', допустим в модели Pages, код в связи 'category' значит что Pages BELONGS-TO Category или 'pivot' BELONGS-TO Category?
  3. Почему приложение выдает ошибку, когда убираю из промежуточной (не только) таблицы PK? Данные для связи я все указал, но программа эти столбцы не может найти. Неужели связь без PK невозможна?
  4. Как я понял, запись по этим связям не работает - только чтение, запись и удаление нужно дописывать в модели ручками, так?
  5. Правильно ли я всё сделал / описал работу кода в комментариях? Если нет, прошу сказать как нужно.


Код рабочий, но сомневаюсь насчет его "правильности".
class Pages extends CActiveRecord
{
	public function relations()
	{
		return array(
			// pivot.page_id = pages.id
			'pivot' => array(self::HAS_ONE, 'PageCategoryPivot', array('page_id' => 'id')),
			// pivot.cat_id = category.id, 2 вопрос про эту строку:
			'category' => array(self::BELONGS_TO, 'Category', array('cat_id' => 'id'), 'through' => 'pivot'),
		);
	}
}

class PageCategoryPivot extends CActiveRecord
{
	public function relations()
	{
			return array(
			'page' => array(self::HAS_ONE, 'Pages', 'page_id'),
			'category' => array(self::HAS_ONE, 'Category', 'cat_id')
		);
	}
}

class Category extends CActiveRecord
{
	public function relations()
	{
		return array(
			// pivot.cat_id = category.id
			'pivot' => array(self::HAS_ONE, 'PageCategoryPivot', array('cat_id' => 'id')),
			// pivot.page_id = pages.id
			'pages' => array(self::HAS_MANY, 'Pages', array('page_id' => 'id'), 'through' => 'pivot')
		);
	}
}
  • Вопрос задан
  • 1750 просмотров
Пригласить эксперта
Ответы на вопрос 1
Тут если есть промежуточная таблица с айдишниками двух других, то связь MANY-MANY иначе бы смысла в такой таблице не было, из оф. документации вот она:
'categories'=>array(self::MANY_MANY, 'Category', 'tbl_post_category(post_id, category_id)'),
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы