Laravelにてトランザクションをしたいのですが、
処理ごとにどこでエラーなのかわかるように例外を投げる方法を知りたいです
注文テーブルに登録する際のトランザクションです
流れはカートテーブルに入っている情報で間違いがなければ注文テーブルに登録し、カートテーブルを削除という流れです
トランザクション開始
1.在庫を引く
2.在庫を引ければ注文テーブルに登録する
3.登録ができればカートテーブルの削除
コードは以下です
DB::beginTransaction(); try { //在庫を差し引く foreach ($cartproducts as $cartproduct) { Product::where('id', $cartproduct->product_id)->update([ 'total_stock' => $cartproduct->total_stock - $cartproduct->quantity, ]); echo "在庫を" . $cartproduct->quantity . "差し引きました"; } //登録処理 foreach ($cartproducts as $cartproduct) { $order->create([ 登録処理 ]); } //カート削除処理 DB::commit(); } catch (\Exception $e) { DB::rollback(); return redirect('cart')->with('flash_message', 'エラーがありました。もう一度やり直してください'); }
質問1つ目の例外を投げる方法ですが、
在庫を差し引けたかどうかはどうやって判断するんでしょうか?
もう一度DBを参照するなどでしょうか?
エラーが発生した場合にわかるということでしょうか?
この在庫を差し引く部分でエラーが発生した場合のthrowの書き方がわかりません。
在庫エラーや削除エラーをキャッチしたいです
処理ごとにthrowを入れる方法を教えて下さい
よろしくおねがいします
要件定義してください。
それぞれ何を以て「エラー」とするか、要件定義してください。
「どうやってするか」ではなく「何をするか」「なぜするか」をまず詰めてください。
でないと「どうやって」も決まりません。
すみません。
在庫がなんかしらのエラーでひくことができなかった場合でお願いします
想定外のエラーが起きた。そんな場合にエラーが出て、表面上では在庫エラーと表示するためにキャッチしたいです
異常系とするなら、「なんかしら」「想定外の」をある程度考えて範囲を決めておかないとテストできません。そういった意味でも
「どうやってするか」ではなく「何をするか」「なぜするか」をまず詰めてください。
でないと「どうやって」も決まりません。
要件不明瞭な状態では答えようがないのが実際です。
ありがとうございます。
突拍子のないことをきいているようで申し訳ございません。。。
例えば文字列が不明でphpでエラーが発生。
在庫部分でエラーが出たよということで、
それをメッセージと共にわかりたいです
「文字列が不明」が私には不明です。すみません。
より具体的に決める必要があります。いわゆる「異常系設計」というやつで、
「なんとなくやってみたなー」だとアプリケーションが成り立たない部分になるので、
こればかりは決めないと誰からもアドバイスはもらえないのではないでしょうか。
「一般的にはどう設計するのか」と問うのでしたらLaravel要素は排除し「セキュリティー」など
適切なタグを付与して設計について質問すると良いのですけど、実際のところどこまでお考えでしょうか?
どう説明したらいいのかがわからないのでほんおに申し訳ないです。
例えば在庫を100ひこうとした場合に、在庫は50しかなかった場合、DB側ではマイナスは受け付けない
そういった場合にエラーがでます。
トランザクションではこういったエラーでも拾うのでしょうか?
拾った場合、在庫でエラーがでましたよと投げたいんです。
カートにいれている間はまだ在庫があった。しかし、確認画面で確定をクリックすると
売り切れになっていた場合、引ける在庫がなくてエラーになってしまった。
この場合、在庫でエラーを投げます
そういった場合に在庫でエラーが出たのか、登録時にエラーが出たのかを分かるようにメッセージを投げたいんです。
エラーが出た箇所でその内容をthrowする場合に
在庫でエラーがでました。
登録時にエラーが出ました
とするためにthrowはどこにどうやって書けばいいのかということなんです。
回答2件
あなたの回答
tips
プレビュー