前言
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更為精確。