Laravel如何应用数据库事务及捕获事务失败后的异常详解

更新:2017-10-27    编辑:瓶子    来源:原创投稿    人气:加载中...    字号:|

标签:如何  后的  详解  使用  数据库  失败  百度搜索

前言

如果大家在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 异常

<?php namespace 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']); } }

总结


评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)

站点导航

您可能在找这些