Связь многие ко многим

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
ilyas.galiev
Сообщения: 39
Зарегистрирован: 2014.08.18, 10:04

Связь многие ко многим

Сообщение ilyas.galiev »

Не получается реализовать связь MANY_MANY.
Вот связи в БД
Изображение

Вот связь в категориях:

Код: Выделить всё

public function relations () {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'product' => array(self::MANY_MANY, 'Product', 'gyp_product_category(product_id, category_id)'),
        );
    }
 
Связь в товарах:

Код: Выделить всё

public function relations () {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'category' => array(self::MANY_MANY, 'Category', 'gyp_product_category(product_id, category_id)'),
        );
    }
 
Контроллер:

Код: Выделить всё

public function actionAdd_product () {
        $model = new Product();
        if(isset($_POST['Product'])) {
            $product = new Product();
            $product->attributes = $_POST['Product'];
            if($product->validate()) {
                if($product->save(false)) {
                    ProductCategory::saveCategories($product->id, $_POST['Product']['category']);
                }
                $this->redirect('products');
            }else {
                $this->render('add_product', array('model' => $product));
            }
        }
        $this->render('add_product', ['model' => $model]);
    }
Сохранение категорий:

Код: Выделить всё

public static function saveCategories($product_id, $categories) {
        $pc = new ProductCategory();
        foreach($categories as $category) {
            $category = (int) $category;
            $pc->unsetAttributes();
            $pc->attributes = ['product_id' => $product_id, 'category_id' => $category];
            if($pc->validate())
                $pc->save(false);
        }
    }

Но проблема в том, что сохраняется либо одна категория, либо ошибка
CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0' for key 'PRIMARY'
Со вчерашнего дня пытаюсь решить, голова не варит уже.
Аватара пользователя
sluchainiyznak
Сообщения: 617
Зарегистрирован: 2013.05.19, 17:51
Откуда: ХМАО-Югра, г. Сургут
Контактная информация:

Re: Связь многие ко многим

Сообщение sluchainiyznak »

ilyas.galiev
Сообщения: 39
Зарегистрирован: 2014.08.18, 10:04

Re: Связь многие ко многим

Сообщение ilyas.galiev »

sluchainiyznak писал(а):Может поможет - http://www.elisdn.ru/blog/26/chekboksi- ... ogim-v-yii
Уже читал.

Все исправил, сразу не додумался.
Посмотрел логи и выяснил что после INSERT'a идет UPDATE (не знаю почему), и в цикле перед сохранением выставил isNewRecord = true. Все работает.
Ответить