私は最近 Laravel を学習していて、学習中に多くの問題に遭遇したので、それらを要約して記録したいと思いました。そこで、次の記事では主に、Laravel がデータベーストランザクションをどのように使用し、トランザクション失敗後の例外をキャプチャするかについての関連情報を紹介します。必要な友達はそれを参照できます。以下を見てみましょう。
はじめに
Laravel のデータベーストランザクションで一連の操作を実行したい場合は、DB ファサードでトランザクションメソッドを使用できます。トランザクションのクロージャ内で例外がスローされた場合、トランザクションは自動的に復元されます。クロージャが正常に実行されると、トランザクションは自動的にコミットされます。
トランザクション メソッドを使用する場合、トランザクションを手動で元に戻したりコミットしたりすることを心配する必要はありません:
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });
トランザクションを手動で操作する
トランザクションを手動で処理し、復元またはコミット操作を完全に制御したい場合は、 DB ファサードは beginTransaction メソッドを使用します:
DB::beginTransaction();
rollBack メソッドを通じてトランザクションを復元することもできます:
DB::rollBack();
最後に、commit メソッドを通じてトランザクションを送信できます:
DB::commit();
注: トランザクション メソッドDB ファサードの機能は、クエリ ステートメント ビルダーと Eloquent ORM トランザクションの制御にも使用できます。
例の紹介
この知識ポイントは、同時に 2 つの異なるテスト ポイントに属しているとします。つまり、テスト ポイントと知識の 2 つのデータです。ポイントは多対多の関係を持ち、このデータ構造を実装するには、次の 3 つのテーブルが必要です。
ナレッジ ポイント テーブル wiki:
--------------------------------------- id title content ---------------------------------------
テスト ポイント テーブル タグ:
------------------- id name -------------------
テスト ポイント ナレッジ ポイント関連付けテーブル wiki_tag_rel
---------------------------------- id tag_id wiki_id ----------------------------------
次に、Wiki データを追加するトランザクションを開く必要があります。Wiki が成功したら、それを指定されたテスト ポイントに関連付けます
(クエリ ビルダーまたは Eloquent ORM を使用して laravel でクエリを実行すると、IlluminateDatabaseQueryException 例外が返されます)失敗した場合)
<?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']); } }
関連する推奨事項:
詳細な説明 Laravel がバックグラウンドで .env 設定を変更する方法
Laravel のミドルウェアがどのように実装されているかを確認してください
以上がLaravelがデータベーストランザクションと例外処理をどのように使用するかについての詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。