Добрый день. Есть 3 таблицы, без внешних ключей.
Долго мучился с relations в yii, никак не мог понять, как связать их без FK. По идее хотел сделать связь many-many с обеих сторон для универсальности, но т.к. вывожу я все равно 1 категорию на страницу, решил что это лишнее, и сделал связь "одна категория - много страниц".
Вопросы такие:
- Не могу понять какого типа сделать связь с Pivot. Pages-Pivot скорее всего HAS_ONE, а вот с категориями как?
- Когда использую 'through', допустим в модели Pages, код в связи 'category' значит что Pages BELONGS-TO Category или 'pivot' BELONGS-TO Category?
- Почему приложение выдает ошибку, когда убираю из промежуточной (не только) таблицы PK? Данные для связи я все указал, но программа эти столбцы не может найти. Неужели связь без PK невозможна?
- Как я понял, запись по этим связям не работает - только чтение, запись и удаление нужно дописывать в модели ручками, так?
- Правильно ли я всё сделал / описал работу кода в комментариях? Если нет, прошу сказать как нужно.
Код рабочий, но сомневаюсь насчет его "правильности".
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')
);
}
}