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

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

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

Сообщение 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);
    }
Пишет "Статус успешно изменен", статус ингредиента меняется, а статус блюда не меняется

rak
Сообщения: 2128
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

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

Сообщение rak »

скорее всего не проходит валидацию, потому и не сохраняет

Spot
Сообщения: 71
Зарегистрирован: 2013.04.09, 04:04

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

Сообщение Spot »

да, валидацию не проходит

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

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

rak
Сообщения: 2128
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

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

Сообщение 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();
}

Spot
Сообщения: 71
Зарегистрирован: 2013.04.09, 04:04

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

Сообщение Spot »

Спасибо, rak!
Получилось

Ответить