前言
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更为精确。