博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Yii2多模型与事务的用法
阅读量:5967 次
发布时间:2019-06-19

本文共 3744 字,大约阅读时间需要 12 分钟。

前言

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部分

'sales-form', 'enableAjaxValidation' => true, 'enableClientValidation' => true,]); ?>
field($model, 'jhlx')->textInput(['maxlength' => true]) ?>
field($model, 'company_id')->textInput(['maxlength' => true]) ?>
field($model, 'sort')->textInput() ?>
field($_model, 'username')->textInput(['maxlength' => true]) ?>
isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>

注:此部分是多模型的使用,当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更为精确。

相关资料

转载地址:http://mtqax.baihongyu.com/

你可能感兴趣的文章
SVN: bdb: BDB1538 Program version 5.3 doesn't match environment version 4.7
查看>>
jsp内置对象作业3-application用户注册
查看>>
android115 自定义控件
查看>>
iOS uuchart 用法
查看>>
c# 多线程 调用带参数函数
查看>>
JQuery 如何选择带有多个class的元素
查看>>
The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
查看>>
VS快速生成JSON数据格式对应的实体
查看>>
Word2vec 模型载入(tensorflow)
查看>>
Linux内核——定时器和时间管理
查看>>
J2EE之初识JSP
查看>>
RabbitMq消息序列化简述
查看>>
i.e., e.g., etc.
查看>>
git忽略文件【转】
查看>>
Web上的支持的图片格式以及它们之间的区别
查看>>
随意而为
查看>>
jQuery监听文本框值改变触发事件(propertychange)
查看>>
HDU--2040
查看>>
甲骨文Java Archive
查看>>
查看数据库错误日志的位置
查看>>