Laravel框架之事务使用及异常捕获

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

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

上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家的支持。

你可能感兴趣的:(laravel,Laravel)