国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

Laravel如何使用數據庫事務及捕獲事務失敗后的異常詳解

2024-05-05 00:00:42
字體:
來源:轉載
供稿:網友

前言

如果大家在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時,如果失敗會返回 Illuminate/Database/QueryException 異常)

<?phpnamespace App/Http/Controllers;use Illuminate/Http/Request;use Illuminate/Database/QueryException;use App/Wiki;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(/Illuminate/Database/QueryException $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']);  }}

總結

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

 

注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 甘孜县| 石家庄市| 祁东县| 夏邑县| 邛崃市| 喀喇沁旗| 广河县| 龙口市| 潼南县| 旬邑县| 辽宁省| 探索| 北海市| 上思县| 淮安市| 句容市| 镇雄县| 武宣县| 农安县| 陵水| 柳州市| 张家港市| 阆中市| 木里| 白沙| 阿城市| 乌鲁木齐县| 营口市| 淮阳县| 日喀则市| 临漳县| 房产| 洞口县| 富阳市| 本溪| 宣威市| 车致| 鲜城| 枣强县| 澳门| 平江县|