摘要:在中要想在數據庫事務中運行一組操作,則可以在中使用方法。如果在事務的閉包內拋出異常,事務將會被自動還原。
Description
在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 的事務。
Example假設有要在數據庫中存儲一個知識點,這個知識點同時屬于兩個不同的考點,也就是考點和知識點這兩個數據是多對多的關系,那么要實現這種數據結構就需要三個表:
知識點表 wiki:
</>復制代碼
---------------------------------------
id title content
---------------------------------------
考點表 tag:
</>復制代碼
-------------------
id name
-------------------
考點知識點關聯表 wiki_tag_rel
</>復制代碼
----------------------------------
id tag_id wiki_id
----------------------------------
現在要開啟事務新增Wiki數據,新增wiki成功后再把它關聯到指定的考點上去
(在laravel中使用查詢構建器或者Eloquent ORM執行query時,如果失敗會返回 IlluminateDatabaseQueryException 異常)
</>復制代碼
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"]);
}
}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/22320.html
摘要:請求未通過的驗證時會拋出此異常。異常處理是非常重要但又容易讓開發者忽略的功能,這篇文章簡單解釋了內部異常處理的機制以及擴展異常處理的方式方法。 異常處理是編程中十分重要但也最容易被人忽視的語言特性,它為開發者提供了處理程序運行時錯誤的機制,對于程序設計來說正確的異常處理能夠防止泄露程序自身細節給用戶,給開發者提供完整的錯誤回溯堆棧,同時也能提高程序的健壯性。 這篇文章我們來簡單梳理一下...
閱讀 1315·2023-04-26 01:03
閱讀 1951·2021-11-23 09:51
閱讀 3316·2021-11-22 15:24
閱讀 2677·2021-09-22 15:18
閱讀 1024·2019-08-30 15:55
閱讀 3495·2019-08-30 15:54
閱讀 2266·2019-08-30 15:53
閱讀 2402·2019-08-30 15:44