在 Yii2 中一次保存多个模型

Save multiple models at a time in Yii2

我有两个模型,UsersStudents。我想同时向这些 table 中插入数据。首先,我将数据保存到 Students 模型中,然后保存到 Users 模型中。

现在,如果数据没有成功插入到 Users 模型中,则已经有一个条目进入 Students table。我想要的是仅当数据可以成功保存在两个模型中时才将数据输入两个模型。

现在我的控制器代码看起来像这样:

    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() 时 return 不正确。此处,$userModel->save() return true 并将数据插入 table.

是否有任何其他选项可以轻松做到这一点?

尝试查看用户模型有什么错误returns。在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());
    ....
}

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

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

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

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

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