Yii2多模型與事務的用法

zacklee發表於2019-05-09

前言

Yii2的多模型與事務平時用的也挺多的,但是網上現有的資源不多,為此我覺得有必要做個總結與分享,雷鋒同志的一貫作風,不做解釋。在利用大夥喝咖啡的時間我親自下海實戰了,實踐出真知,不耍嘴皮子,拿經驗說事。OK,Stop,要是不感興趣的呢可以不看了,要是感興趣的呢可以繼續往下看,絕對讓你收穫頗豐哈哈。

目的分析

通過實戰,分享Yii2多模型與事務的簡單用法。

多模型

1、controller部分

    public function actionCreate()
    {
        $model = new OpportunityType();
        $_model=new User();
        $post=Yii::$app->request->post();
        if(isset($post[`User`]) && isset($post[`OpportunityType`]))
       {  
            $model->attributes=$post[`OpportunityType`];  
            $_model->attributes=$post[`User`]; 
            if($model->validate() && $_model->validate())//這裡是先驗證資料,如果通過再save()。  
             {      
                  $model->save(false); //儲存不驗證(前面已經驗證了,所以此處可以設為false)
                  $_model->save(false);
                  return $this->redirect([`view`, `id` => $model->id]);
             }else {
                return $this->render(`create`, [
                    `model` => $model,
                    `_model`=>$_model,
                ]);
            } 
       
        } else {
            return $this->render(`create`, [
                `model` => $model,
                `_model`=>$_model,
            ]);
        }
    }

2、view部分

<?php
    $form = ActiveForm::begin([
    `id`=>`sales-form`,
    `enableAjaxValidation` => true,
    `enableClientValidation` => true,
]);
    ?>
    <?= $form->field($model, `jhlx`)->textInput([`maxlength` => true]) ?>

    <?= $form->field($model, `company_id`)->textInput([`maxlength` => true]) ?>


    <?= $form->field($model, `sort`)->textInput() ?>

    <?= $form->field($_model, `username`)->textInput([`maxlength` => true]) ?>

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? Yii::t(`app`, `Create`) : Yii::t(`app`, `Update`), [`class` => $model->isNewRecord ? `btn btn-success` : `btn btn-primary`]) ?>
    </div>

    <?php ActiveForm::end(); ?>

注:此部分是多模型的使用,當OpportunityType和User兩個驗證通過之後才能儲存資料。

事務

1、controller部分

   public function actionCreate()
    {
        $model = new OpportunityType();
        $_model=new User();
        $post=Yii::$app->request->post();

        if(isset($post[`User`]) && isset($post[`OpportunityType`]))
       {   
            $db = Yii::$app->db;
            $transaction = $db->beginTransaction();  //開啟事務
            try {
                $model->attributes=$post[`OpportunityType`];  
                $_model->attributes=$post[`User`];
                if($_model->save())//這裡是先驗證資料,如果通過再save()。  
                 {      
                     $model->user_id=$_model->id;
                     if(!$model->save()){
                         $error=array_values($model->getFirstErrors())[0];
                         throw new Exception($error);//丟擲異常
                     }
                     
                 }else{
                    $error=array_values($_model->getFirstErrors())[0];
                    throw new Exception($error);//丟擲異常
                 }  
                // 提交記錄(執行事務)
               $transaction->commit();
               return $this->redirect([`view`, `id` => $model->id]);
             } catch (Exception $e) {   
                // 記錄回滾(事務回滾)
                $transaction->rollBack();
                Yii::$app->session->setFlash(`error`,$e->getMessage());
                return $this->render(`create`, [
                            `model` => $model,
                            `_model`=>$_model,
                        ]);
            }
        } else {
            return $this->render(`create`, [
                `model` => $model,
                `_model`=>$_model,
            ]);
        }
    }

注:要想事務回滾,必須丟擲異常。
2、view部分還是和多模型的一樣,此處省略。

總結分析

1、多模型與model有聯絡,事務與資料庫有聯絡。
2、多模型model驗證資料全部通過後才能儲存資料,否則儲存失敗;事務儲存資料遇到異常會把原來已儲存的資料撤銷。
3、多模型表與表之間無聯絡,事務表與表之間要有聯絡。

附加

isset與empty的區別
1、isset($var)判斷變數是否設定,empty($var)判斷變數是否為空!
如$one已經定義沒有值,isset($one)返回true,判斷存在;empty($one)判斷為空,判斷存在,同樣返回true。
如$one定義為null,isset($one)返回false;empty($one)返回true(重要區別)。
2、empty比isset範圍更廣,進一步說isset更為精確。

相關資料

多模型的複合表單
事務(Transaction)
Yii事務什麼情況使用?

相關文章