Laravelがデータベーストランザクションと例外処理をどのように使用するかについての詳細な説明

*文
リリース: 2023-03-19 08:52:01
オリジナル
2403 人が閲覧しました

私は最近 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(&#39;,&#39;, $request->get(&#39;tag_id&#39;));
   $wiki_id = DB::table(&#39;wiki&#39;)->insertGetId([
    &#39;title&#39; => $request->get(&#39;title&#39;),
    &#39;content&#39; => $request->get(&#39;content&#39;)
   ]);

   $relationData = [];
   foreach($tagIds as $tagId) {
    $data = [&#39;wiki_id&#39; => $wiki_id, &#39;tag_id&#39; => $tagId];
    $relationData[] = $data;
   }
   DB::table(&#39;wiki_tag_rel&#39;)->insert($relationData);
   DB::commit();
  } catch(\Illuminate\Database\QueryException $ex) {
   DB::rollback();
   return \Response::json([&#39;status&#39; => &#39;error&#39;, &#39;error_msg&#39; => &#39;Failed, please contact supervisor&#39;]);
  }
  
  return \Response::json([&#39;status&#39; => &#39;ok&#39;]);
 }


 //用DB facade的事务方法控制 Eloquent ORM的事务
 public function createWiki(array $data)
 {
  DB::beginTransaction();
  try {
   $tagIds = explode(&#39;,&#39;, $data[&#39;tag_id&#39;]);
   $newWiki = Wiki::create([
    &#39;title&#39; => $data[&#39;title&#39;],
    &#39;content&#39; => $data[&#39;content&#39;]
   ]);
   //Wiki和Tag两个Model使用了belongsToMany建立了多对多的关系
   //通过attach方法来附加wiki和tag的关系(写入中间表)
   $newWiki->tags()->attach($tagIds);
   DB::commit();
  } catch(QueryException $ex) {
   DB::rollback();
   return \Response::json([&#39;status&#39; => &#39;error&#39;, &#39;error_msg&#39; => &#39;Failed, please contact supervisor&#39;]);
  }

  return \Response::json([&#39;status&#39; => &#39;ok&#39;]);
  }

}
ログイン後にコピー

関連する推奨事項:

詳細な説明 Laravel がバックグラウンドで .env 設定を変更する方法

Laravel のミドルウェアがどのように実装されているかを確認してください

Laravel 最適化分割ルーティングファイル

以上がLaravelがデータベーストランザクションと例外処理をどのように使用するかについての詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!