1、transaction 方法
DB::transaction(function () {
DB::table('users')->update(['id' => 1]);
DB::table('posts')->delete();
});
2、手動提交
DB::beginTransaction();
你也可以通過 rollBack 方法來還原事務:
DB::rollBack();
最後,可以通過 commit 方法來提交這個事務:
DB::commit();
3、 Eloquent ORM中使用事務
public function menuDel($id)
{
$menu = WechatMenu::find($id);
if ($menu["pid"] == 0) {
DB::beginTransaction();
try {
WechatMenu::where('pid', $id)->delete();
WechatMenu::where('id', $id)->delete();
DB::commit();
} catch (QueryException $exception) {
DB::rollback();
return redirect(route("wechat.menu"))->with('status', 'success')
->withErrors(["操作失敗!"]);
}
return redirect(route("wechat.menu"))->with('status', 'success')
->withErrors(["操作成功!"]);
} else {
if (WechatMenu::where('id', $id)->delete()) {
return redirect(route("wechat.menu"))->with('status', 'success')
->withErrors(["操作成功!"]);
} else {
return redirect(route("wechat.menu"))->with('status', 'error')
->withErrors(["操作失敗!"]);
}
}
}
<?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']);
}
}
參考了網上部分代碼