成人精品一区二区三区中文字幕-成人精品一区二区三区-成人精品一级毛片-成人精品亚洲-日本在线视频一区二区-日本在线视频免费

導航首頁 ? 技術教程 ? Laravel如何使用數據庫事務及捕獲事務失敗后的異常詳解
全站頭部文字 我要出現在這里
Laravel如何使用數據庫事務及捕獲事務失敗后的異常詳解 907 2023-12-10   

前言

如果大家在Laravel中要想在數據庫事務中運行一組操作,則可以在 DB facade 中使用 transaction 方法。如果在事務的閉包內拋出異常,事務將會被自動還原。如果閉包運行成功,事務將被自動提交。

你不需要擔心在使用 transaction 方法時還需要親自去手動還原或提交事務:

DB::transaction(function () {
 DB::table('users')->update(['votes' => 1]);

 DB::table('posts')->delete();
});

手動操作事務

如果你想手動處理事務并對還原或提交操作進行完全控制,則可以在 DB facade 使用 beginTransaction 方法:

DB::beginTransaction();

你也可以通過 rollBack 方法來還原事務:

DB::rollBack();

最后,可以通過 commit 方法來提交這個事務:

DB::commit();

注意: DB facade 的事務方法也可以用來控制 查詢語句構造器 及 Eloquent ORM 的事務。

示例介紹

假設有要在數據庫中存儲一個知識點,這個知識點同時屬于兩個不同的考點,也就是考點和知識點這兩個數據是多對多的關系,那么要實現這種數據結構就需要三個表:

知識點表 wiki:

---------------------------------------
id  title    content
--------------------------------------- 

考點表 tag:

-------------------
id  name
-------------------

考點知識點關聯表 wiki_tag_rel

----------------------------------
id   tag_id  wiki_id
----------------------------------

現在要開啟事務新增Wiki數據,新增wiki成功后再把它關聯到指定的考點上去

(在laravel中使用查詢構建器或者Eloquent ORM執行query時,如果失敗會返回 IlluminateDatabaseQueryException 異常)

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use IlluminateDatabaseQueryException;
use AppWiki;

class TestController extends Controller
{
 //用DB facade的事務方法控制 查詢語句構建器的事務
 public function storeWiki(Request $request)
 {
  DB::beginTransaction();
  try {
   $tagIds = explode(',', $request->get('tag_id'));
   $wiki_id = DB::table('wiki')->insertGetId([
    'title' => $request->get('title'),
    'content' => $request->get('content')
   ]);

   $relationData = [];
   foreach($tagIds as $tagId) {
    $data = ['wiki_id' => $wiki_id, 'tag_id' => $tagId];
    $relationData[] = $data;
   }
   DB::table('wiki_tag_rel')->insert($relationData);
   DB::commit();
  } catch(IlluminateDatabaseQueryException $ex) {
   DB::rollback();
   return Response::json(['status' => 'error', 'error_msg' => 'Failed, please contact supervisor']);
  }
  
  return Response::json(['status' => 'ok']);
 }


 //用DB facade的事務方法控制 Eloquent ORM的事務
 public function createWiki(array $data)
 {
  DB::beginTransaction();
  try {
   $tagIds = explode(',', $data['tag_id']);
   $newWiki = Wiki::create([
    'title' => $data['title'],
    'content' => $data['content']
   ]);
   //Wiki和Tag兩個Model使用了belongsToMany建立了多對多的關系
   //通過attach方法來附加wiki和tag的關系(寫入中間表)
   $newWiki->tags()->attach($tagIds);
   DB::commit();
  } catch(QueryException $ex) {
   DB::rollback();
   return Response::json(['status' => 'error', 'error_msg' => 'Failed, please contact supervisor']);
  }

  return Response::json(['status' => 'ok']);
  }

}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對綠夏網的支持。


主站蜘蛛池模板: 李多海| 诱惑热舞| 陈妍希三级露全乳电影| 屈楚萧| 家的港湾| 舌吻床戏视频| 庞敏| 极寒复出| 同性gay在线| 新还珠格格演员表| 河南省物业管理条例| 草刈正雄| angelina全集在线观看| 王同辉| 宋元甫| 迎宾进行曲| 意外的春天 电影| 林赛斯特林| 我的仨妈俩爸演员表| 电影儿媳| 张柏芝演的电视剧| 王渝萱林教授电影| 液氨化学性质| 电影《林海雪原》| 红海行动2免费看完整版| 时间空间和人第二部| 冬日行动电影免费观看| 林智妍三级全部电影| 胡金铨最好的十部电影| 影视剧分娩片段合集| 阮虔芷个人资料| 马玉琴20岁照片| 365:逆转命运的1年 电视剧| 太医派的开胃汤配方| 水蜜桃蜜桃在线观看 | 贼王之王| 三年级英语| 西藏藏语卫视| 南宝拉| 跳跳动画| 巨齿鲨2:深渊 电影|

!!!站長長期在線接!!!

網站、小程序:定制開發/二次開發/仿制開發等

各種疑難雜癥解決/定制接口/定制采集等

站長微信:lxwl520520

站長QQ:1737366103