У меня две модели: Users
и Students
. Я хочу вставлять данные в эти таблицы одновременно. Во-первых, я сохраняю данные в модели Students
а затем в модели Users
.
Теперь, если данные не будут успешно вставлены в модель Users
в таблице Students
уже есть запись. То, что я хочу, – это записи данных в обе модели, только если данные могут быть успешно сохранены в обоих.
Теперь мой код контроллера выглядит примерно так:
public function actionCreate() { $model = new Students(); $userModel = new Users(); if ($model->load(Yii::$app->request->post()) && $userModel->load(Yii::$app->request->post()) && $model->save() && $userModel->save()) { return $this->redirect(['view', 'id' => $model->id]); } else { return $this->render('create', [ 'model' => $model, 'userModel' => $userModel, ]); } }
ошибка в модели пользователей и не возвращает true, когда я вызываю $userModel->save()
. здесь $userModel->save()
возвращает true и вставляет данные в таблицу.
Есть ли другой способ сделать это без каких-либо осложнений?
Вы должны использовать транзакции, чтобы обе модели были сохранены правильно. Пример:
$transaction = Yii::$app->db->beginTransaction(); try { if ($model->save() && $userModel->save()) { $transaction->commit(); } else { $transaction->rollBack(); } } catch (Exception $e) { $transaction->rollBack(); }
Yii2 уже может это сделать. Подтвердите ввод перед сохранением данных в модели:
if ( $model->load(Yii::$app->request->post() && $userModel->load(Yii::$app->request->post() ) { // Check validation if ($model->validate() && $userModel->validate()) { $model->save(); $userModel->save(); } else { // Throw error } }
Дополнительная информация: http://www.yiiframework.com/doc-2.0/guide-input-validation.html
Попытайтесь увидеть, какие ошибки возвращает модель пользователей. Вызовите метод getErrors () в условии else.
if ($model->load(Yii::$app->request->post()) && $userModel->load(Yii::$app->request->post()) && $model->save() && $userModel->save()) { return $this->redirect(['view', 'id' => $model->id]); } else { var_dump($userModel->getErrors()); .... }
И вы увидите ошибки, которые не позволяют сохранить модель «Пользователи».