Laravel 中使用事務

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

參考了網上部分代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章