在Yii2中一次保存多个模型

时间:2016-02-05 10:02:52

标签: php transactions yii2

我有两个模型,UsersStudents。我想同时在这些表中插入数据。首先,我将数据保存到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,
            ]);
        }
    }

用户模型中存在错误,并且在调用$userModel->save()时不返回true。在这里,$userModel->save()返回true并将数据插入表中。

在没有任何复杂情况的情况下还有其他选择吗?

3 个答案:

答案 0 :(得分:10)

您应该使用事务来确保正确保存两个模型。例如:

$transaction = Yii::$app->db->beginTransaction();

try  {
    if ($model->save() && $userModel->save()) {
        $transaction->commit();
    } else {
        $transaction->rollBack();
    }
} catch (Exception $e) {
    $transaction->rollBack();
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

尝试查看用户模型返回的错误。在else条件中调用getErrors()方法。

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());
    ....
}

您将看到不允许保存用户模型的错误。