成都C++培训
达内成都天府中心

13408446380

热门课程

C++培训_Yii2的多模型与事务他们的区别在哪?

  • 时间:2016-08-31
  • 发布:达内
  • 来源:达内

Yii2的多模型与事务平时用的也挺多的,但是不知道大家有没有去思考过这样的一个问题“Yii2的多模型与事务有何区别?”换句话说,何时该用多模型何时该用事务?我百度、segmentfault可能找到答案的资源网站都找过了,遗憾的是并没能找到令我满意的答案。为了解决疑惑,利用大伙喝咖啡的时间我亲自下海实战了,实践出真知!通过实践比较发现确实存在不少区别。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->validate() && $_model->validate())//这里是先验证数据,如果通过再save()。  
                 {      
                      $model->save(false);
                      $_model->save(false); 
                 }else{
                    $error=!empty(array_values($model->getFirstErrors())[0])?array_values($model->getFirstErrors())[0]: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部分还是和多模型的一样,此处省略。
相信到这里大家也都看出了多模型与事务的其中之一的区别,就是Yii2用事务并附带表单验证的话,代码量增多了,多做了一些不必要且重复的事。
多模型与事务的区别
通过以上的结果,已经给了大家一丝丝的启发。这里我再做个大总结,全面分析下:
1、多模型是依赖于Yii2自带的model验证的,事务可以依赖也可以不依赖。
2、事务用途广,多模型灵活。
3、事务遇到异常才会回滚,多模型验证失败就无法保存。
多模型与事务的使用优劣
知道了多模型与事务的区别,在使用上大家应该有底了。
1、使用Yii2自带的model验证的话,优先选择多模型,事务劣。

2、像批量删除这种不依赖model的只能用事务,多模型做不到。

上一篇:C++培训:C语言需要收录的!
下一篇:C++培训:10个小贴士:C和c++代码优化性能改进

C++教程:这些游戏的源码你都有吗

名校海归硕士参加达内培训,获11k高薪入职中国500强企业

成都达内COO:不断创新,打造IT全产业链的职业课程版图

选择城市和中心
贵州省

广西省

海南省