Laravelでトランザクション処理の方法をサンプル付きで解説

今回は、Laravelでトランザクション処理を行う方法をサンプル付きでまとめました。

Laravelでトランザクション処理を行う方法は2つあります。

  1. DBファザードのtransactionメソッドを利用する
  2. 手動トランザクション(DBファザードのbeginTransaction, rollBack, commit を利用する)

それぞれについてサンプルを交えてまとめました。

DBファザードのtransactionメソッドを利用する

DBファザードのtransactionメソッドにクロージャーを渡し、その中でDBの更新処理を行います。

DB::transaction(function () {
    // 更新処理
});

サンプルとして、記事の情報・記事に関連するタグを同時に更新する場合だと、以下のようになります。

public function update (Post $post, Request $request)
{
    $params = $request->all();

    return DB::transaction(function () use ($post, $params) {
        $post->fill($params)->save();
        $post->tags()->sync($params['tag_ids']);

        return $post;
    });
}

transactionメソッドを利用するポイントとしては、

  • クロージャーの中の処理で例外が発生すると自動でロールバックされる
  • クロージャーの中で返した値がtransactionメソッドの返り値になる

あたりを知っておくと良いと思います。

手動トランザクション

トランザクションの開始・コミット・ロールバックを自分で記述することができます。

記事の更新の例だと、このようになります。

public function update (Post $post, Request $request)
{
    $params = $request->all();

    DB::beginTransaction();
    try {
        $post->fill($params)->save();
        $post->tags()->sync($params['tag_ids']);
        DB::commit();
    } catch (\Exception $e) {
        DB::rollback();
    }

    return $post;
}

さいごに

トランザクション処理を行う2つの方法についてまとめました。
基本的には、クロージャーを利用したトランザクションの方法が推奨されますが、transactionメソッドで対応できないような場合に、手動トランザクションを利用すると良いと思います。
  
  
人気Laravelの学習におすすめの本を2選!

この記事と関連している記事