【Laravel】トランザクションで複数のインサート|try…catchでロールバックまで。

Laravel database sql

Laravelで複数のテーブルにinsertやupdateをするときに、整合性が取れるようにDBのトランザクションを使いたいときはよくありますよね

その使い方を教えます

DB::transactionメソッドで複数クエリをコミットする

DBのトランザクションを開いて、全部のクエリが成功したらコミット、もし失敗したらロールバックをするサンプルコードはこれです。

use Illuminate\Support\Facades\DB;


DB::beginTransaction();

try {
    Model::save(...);
    Model::update(...);

    DB::commit();

} catch (\Throwable $e) {
    DB::rollback();
}

これだけです。

ポイントは例外でロールバックかなと。

 

まずDB::beginTransactionでトランザクション開きます。

あとはtry catchで囲んで、saveやupdateメソッドを実行します。

もしそのあたりのメソッドが失敗するとExceptionを投げてきます。

そのときはcatchブロックで受け取って、DB::rollbackでトランザクションをロールバックしてキャンセルします。

全部のクエリが成功するとDB::commitでデータベースにコミットされます。

Laravelの公式はこちら

https://laravel.com/docs/9.x/database#database-transactions