🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

1829閲覧

laravel updateorCreateメソッドにてトランザクションを有効にする方法

prr4e

総合スコア73

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2021/02/27 08:41

編集2021/02/27 10:03

いままで生のPHPは触っていましたが、Laravelにて新規開発をすることになりました。
Laravel5.5.43 です

表題にてTransactionの貼り方を教えていただけますでしょうか

DB::beginTransaction()

DBファサードを使ってトランザクションを貼る場合は上記記述になりますが、
updateorCreateを使ってトランザクションを貼ってもロールバックが聞きません。
お手数ですが、ご教授いただけますでしょか。

私が試したのは

DB::beginTransaction(); Post::updateOrCreate( ['id' => '1'] ,['name' => 'テスト'] ); DB::rollback();

上記だとDBにて更新されてしまうため。クロージャーを使うように変更

DB::beginTransaction(function() { Post::updateOrCreate( ['id' => '1'] ,['name' => 'テスト'] ); });

上記だと新規データも入らなくなりました。

その他

DB::connection('post')->beginTransaction();

を試しましたが、rollbackができませんでした。

ググって色々調べて見ましたが、私のコードの何が間違っているのかさえわからない状態になってしまったので、
ご教授いただけると嬉しいです。

お手数ですが、宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phper.k

2021/02/27 08:44 編集

提示されたコードに間違いは見当たらない。 他の原因があるのでは? commit が見当たらないのが気になりますが。
prr4e

2021/02/27 08:50

ありがとうございいます。 DB:commit()とDB::rollbackを両方記述して、 それぞれコメントアウトしながら記述した結果で、rollbackが効きませんでした。
m.ts10806

2021/02/27 09:45

Laravelのバージョンをマイナーバージョンまで記載願います。
m.ts10806

2021/02/27 09:47

>beinTransaction これは本当にこう書いたのでしょうか。自身のコードをコピペしてますか?
prr4e

2021/02/27 10:05

バージョン情報を記載しました。 一部実際のコードと違いがあったので、 再度実際にソースよりコピーして転記いたしました。
guest

回答1

0

自己解決

phper.kさん、 m.ts10806さん

お時間取らせてすみませんでした。
自己解決しました。

結果的にTransactionを貼る時も、commitやrollbackする時も
DBの接続先を指定することで解決しました。

■検証結果

  1. 例外処理内で、commitやrollbackを交互にコメントアウトして検証

  ・どちらもDBへ登録されました。

DB::beginTransaction(); try{ Post::updateOrCreate( ['id' => '1'] ,['name' => 'テスト'] ); throw new Exception(); DB::commit(); } catch (Exception $e) { DB::commit(); //DB:rollback(); }
  1. 例外処理内で、commitやrollbackを交互にコメントアウトして検証

  ・rollback時はDBへ登録されず、commitのみ登録されました。

DB::connection('database')->beginTransaction(); try{ Post::updateOrCreate( ['id' => '1'] ,['name' => 'テスト'] ); throw new Exception(); DB::connection('database')->commit(); } catch (Exception $e) { DB::connection('database')->commit(); //DB:connection('database')->rollback(); }

config/database.phpには
複数の接続先がありますが、このコントローラの中で指定しているモデルは
App/Model.phpだけで、その中で固定のconnectionをしているので、
問題はないと思っていますが、やはり明示的に記述しないとだめなのかはわかっていませんが、
とりあえず明示的にrollbackすることができました。

connection名を明示的にしておらず現在本番感動中のものもあるのですが、
もしかしたら、明示的にrollbackできているのかが・・・・
別途検証してみようかと思っています。

ありがとうございました。

投稿2021/02/28 06:40

prr4e

総合スコア73

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問