Yii « Сохранение связанных данных

Разбираюсь с Реляционной Active Record в Yii, но не могу понять, каким образом добавить данные используя связь между таблицами.

Имеется три тиблицы:
post (id, title) — таблица записей (постов)
category (id, title) — таблица категорий
post_category (post_id, category_id) — таблица связей между постом и категориями.
У одной записи (post) имеется несколько категорий.

Модель Post:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }

class Post extends CActiveRecord
{
    public function relations()
    {
        return array(
            'categories'=>array(self::MANY_MANY, 'Category',
                'tbl_post_category(post_id, category_id)'),
        );
    }
...
}
 


Собственно вопрос в том, как добавить новую запись в таблицу post, а так же и в post_category? Надо ли использоваться метод afterSave в Post моделе? Что в нём необходимо указать в таком случае?
Может имеется какой-нибудь пример? Увы, но рецепт с сайта yiiframework.ru немного с иным случаем (там связь один к много, а не много к много).

1 ответов


По аналогии с примером из рецептов:


$Post = new Post;
$Post->id = 1;
$Post->title = 'title';
$Post->categoryIds = array(1,3,10);

class Post extends CActiveRecord
{
    public $categoryIds = array();

    public function relations()
    {
        return array(
            'categories'=>array(self::MANY_MANY, 'Category',
                'tbl_post_category(post_id, category_id)'),
        );
    }
   
    protected function afterSave()
    {
        parent::afterSave();
        foreach ($this->categoryIds as $catID) {
            $PostCategory = new PostCategory;
            $PostCategory->post_id = $this->id;
            $PostCategory->category_id = $catID;
            $PostCategory->save();
        }
    }
}
 

Если не хочется создавать промежуточные модели, можно использовать готовое поведение (конкретно это для связей многие ко многим, но если нужно, в других расширениях на сайте есть и более универсальные поведения).


Спасибо за ссылку на http://www.yiiframework.com/extension/cadvancedarbehavior - указанное решение прекрасно подошло.