Как правильно поступить при сохранении batchInsert?

Пытаюсь организовать работу каталога следующим образом это модели Category, CatToProd, Product то есть Product связан через CatToProd с Category. Причем у продуктов может быть множество категорий. Категории у продукта сохраняю следующим образом это вид связанный через контролер с моделью продукт

<?=$form->field($model, 'category')->widget(Select2::classname(), [
            'data' => $category,
            'language' => 'en',
            'options' => ['placeholder' => Html::encode('Select Category'),'multiple' => true],
            'pluginOptions' => [
                'allowClear' => true
            ],
        ])->label(false); ?>// $category массив ключ id категории и title


таким образом пытаюсь сохранить в модели

public function  afterSave($insert, $changedAttributes)
    {
        $this->categorySave($this->category,$this->id);
        parent::afterSave($insert, $changedAttributes); // TODO: Change the autogenerated stub
    }
    protected function categorySave($categorysId,$modelId){
        $batchArr=array();
        foreach ($categorysId as $category){
            $batchArr[]=[$category,$modelId];
        }
        Yii::$app->db->createCommand()->batchInsert('cat_to_prod',['id_category','id_product'],$batchArr)->execute();
    }

но тут как говорится неждана параска снискала украинских футболистив. В чем суть при редактировании товара если пытаюсь редактировать категории новые записываются, а если хочу удалить старые они не удаляются. Я даже в идее не могу представить как лучше это организовать. Можете посоветовать куда двигаться.
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
@MadridianFox
Web-программист, многостаночник
Ну так они и не будут удаляться. Вы же их не удаляете, только дописываете.
Я для себя выделил два подхода для таких случаев:

1) Чисто но сложно. Берём список категорий товара из базы и с помощью array_diff дважды сравниваем его с тем что пришло из формы. Один раз array_diff($cats_from_form, $cats_from_db), второй раз аргументы меняем местами. Эта функция возвращает элементы второго массива, которых нет в первом или как-то так, точно не помню. Таким образом мы получаем список категорий которые пользователь добавил и их надо записать в базу, и список категорий которые пользователь убрал - и их надо удалить. Дальше просто делаем бачИнсерт по одному массиву и делит по другому.

2) Грязно но быстро. Просто удаляем все категории товара и заново инсертим все категории что пришли из формы.

На самом деле первый способ имеет смысл применять только если запись связи товара с категорией "ценная" и хранит что-то кроме внешних ключей на эти две таблицы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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