piyokokkox’s blog

技術、グルメ、輸入菓子、料理、日常、ゲームなど...書きたいことを書き殴る

【Laravel】DB::transaction内でのreturnについて 備忘録🗒

こんばんは!piyokokkoxです🐥

本日はプライベートの用事がありまして更新が遅くなってしまいました🙇‍♀️

今回は開発者らしく、開発の話題になります!

私が開発の仕事に就いてから、割と初期の頃に躓いていた処理についてお話ししたいと思います。

DB::transaction」というDBの作成、更新をよしなにしてくれるメソッドがLaravelには存在します。これを噛ませることにより、エラーが出て処理が停止してしまっても、ロールバックをしてくれます。逆を言えば、これを噛ませないとそのまま処理が進んでしまい、宙ぶらりんなデータが生まれてしまったりしてしまいます。

今回は、そんなメソッドのreturnの扱いについて説明したいと思います。

  • DB::transaction内の無名関数でのreturnについて

こちらはNG例

<?php
public function example($name, $id)
{
    DB::transaction(function () use ($name, $id) {
        $user= User::where([
            ['name', $name],
            ['id', $id]
         ])->first();
        return $user;
    });
}

$this->example('hoge', 1); // 返り値はnull
?>

理由としては、DB::transactionはあくまでもDBでのデータの作成、更新処理など、DBの一覧の操作を処理するためのものです。 その中でreturnをしてもexampleメソッドの返り値にはなりません。

OK例を以下に示します。

<?php
public function example($name, $id)
{
    return DB::transaction(function () use ($name, $id) {
        $user= User::where([
            ['name', $name],
            ['id', $id]
         ])->first();
        return $user;
    });
}

$this->example('hoge', 1); // 返り値はテーブル内に対象のデータが存在する場合は任意の値が返ってくる。
?>

DB::transaction自体をreturnしてあげると、結果が返されます。 私は最初の頃これで躓いていました。エラーは出ないのでわからないんですよね😂

この記事では、基本的な話になると思いますが、DB::transactionのreturnの取り扱いについて紹介しました。

この記事を読んで、少しでも参考になればいいと思います。

ここまで読んでいただきありがとうございました!