foreachで回して何回かDBに保存する・更新する場合や、複数のDB処理が並んでいる場合など
処理のどこかでエラーが出てしまうと、エラーの後続が未保存となってしまいます。
そこで、LaravelではDBファザードのトランザクションメソッドを使うと
エラーが起きた場合もDBをロールバックを行なってくれ、中途半端なDB保存を防いでくれます!便利!
処理が1回のみの場合
普通のDB操作で1回のみの場合、
Hoge::create([…]);
この書き方でちゃんとロールバックをし、エラー処理を行なってくれます。
問題は以下のような時
複数処理の場合
Hoge::create([…]);
Hoge::update([…]);
Hoge::destroy(..);
このように処理が並んでいた場合、途中でコケてもロールバックしてくれません。
正確には、エラーが起きたメソッド単体のみでしかロールバックされません。それぞれのメソッドでトランザクションが別になってしまっているめです。
複数処理時にはトランザクションメソッドでくくる!
そこで、以下のようにトランザウションメソッドで括れば
DB::transaction(function () { Hoge::create([…]); Hoge::update([…]); Hoge::destroy(..); });
こうすればメソッド内のどこでエラーが起きてもロールバックしてくれます!