多模型+事务+php,Yii2多模型与事务的用法

前言

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

$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]) ?>

= Html::submitButton($model->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更为精确。

相关资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值