Страница 1 из 1

Сохранение связанной модели (many to many)

Добавлено: 2021.03.01, 09:52
Spot
Dishes.php

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

    public function getIngredients()
    {
        return $this->hasMany(Ingredients::className(), ['id' => 'ingredients_id'])
            ->viaTable('dishes_ingredients', ['dishes_id' => 'id']);
    }
Ingredients.php

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

    public function getDishes()
    {
        return $this->hasMany(Dishes::className(), ['id' => 'dishes_id'])
            ->viaTable('dishes_ingredients', ['ingredients_id' => 'id']);
    }
IngredientsController.php

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

    private function changeStatus($id,$status_id)
    {
        $model = $this->findModel($id);

        $transaction = $model::getDb()->beginTransaction();

        try {
            $model->status_id = $status_id;
            $model->save();
            foreach ($model->dishes as $dish) {
                $dish->status_id = $status_id;
                //var_dump($dish->name);
                $dish->save();
            }
            //exit();
            Yii::$app->session->setFlash('success', "Статус успешно изменен");
            $transaction->commit();
        } catch(\Exception $e) {
            $transaction->rollBack();
            Yii::$app->session->setFlash('error', $e->getMessage()); 
        } catch(\Throwable $e) {
            $transaction->rollBack();
            Yii::$app->session->setFlash('error', $e->getMessage()); 
        }

        return $this->redirect(Yii::$app->request->referrer);
    }

    public function actionHide($id)
    {
        $this->changestatus($id,2);
    }
Пишет "Статус успешно изменен", статус ингредиента меняется, а статус блюда не меняется

Re: Сохранение связанной модели (many to many)

Добавлено: 2021.03.01, 13:03
rak
скорее всего не проходит валидацию, потому и не сохраняет

Re: Сохранение связанной модели (many to many)

Добавлено: 2021.03.01, 15:00
Spot
да, валидацию не проходит

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

            foreach ($model->dishes as $dish) {
                $dish->status_id = $status_id;
                
                if ($dish->validate()){
                    echo "Валидно";
                } else {
                    echo $dish->errors;
                }
            }
            exit();
выводит "Array to string conversion"
и как делать так, чтоб при ошибке валидации вызывалось исключение и транзакция не коммитился

Re: Сохранение связанной модели (many to many)

Добавлено: 2021.03.01, 15:16
rak
Spot писал(а): 2021.03.01, 15:00 да, валидацию не проходит

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

            foreach ($model->dishes as $dish) {
                $dish->status_id = $status_id;
                
                if ($dish->validate()){
                    echo "Валидно";
                } else {
                    echo $dish->errors;
                }
            }
            exit();
выводит "Array to string conversion"
и как делать так, чтоб при ошибке валидации вызывалось исключение и транзакция не коммитился

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

if (!$dish->validate()){
    throw new Exception();
}

Re: Сохранение связанной модели (many to many)

Добавлено: 2021.03.02, 02:55
Spot
Спасибо, rak!
Получилось