実現したいこと
商品の個数をカート内で変更し、変更した数量に応じて表示する合計金額を変えたい。
前提
LaravelでECサイトを作っています。
その際、カート内で商品の数量を変更できるようにしたいです。
数量の変更はセレクトボックスで行い、その値をJavaScriptで取得して、それをajax通信によってデータベースに保存しています。(データベースに保存する理由は、カート内の商品情報をセッションで管理するためです。)
商品が一つの場合は成功するのですが、商品が複数あると、数量変更した際すべての商品の数量が、その商品の変更後の値として認識されて合計金額が算出されてしまいます。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
index.php
1<select name="change_quantity" data-productid="{{ $item->id }}" id=""> 2 <option value="1" {{ $item->pivot->quantity == 1 ? 'selected' : ''}}>1</option> 3 <option value="2" {{ $item->pivot->quantity == 2 ? 'selected' : ''}}>2</option> 4 <option value="3" {{ $item->pivot->quantity == 3 ? 'selected' : ''}}>3</option> 5 <option value="4" {{ $item->pivot->quantity == 4 ? 'selected' : ''}}>4</option> 6 <option value="5" {{ $item->pivot->quantity == 5 ? 'selected' : ''}}>5</option> 7 <option value="6" {{ $item->pivot->quantity == 6 ? 'selected' : ''}}>6</option> 8 <option value="7" {{ $item->pivot->quantity == 7 ? 'selected' : ''}}>7</option> 9 <option value="8" {{ $item->pivot->quantity == 8 ? 'selected' : ''}}>8</option> 10 <option value="9" {{ $item->pivot->quantity == 9 ? 'selected' : ''}}>9</option> 11</select> 12個
script.js
1$('[name=change_quantity]').on('change', function () { 2 // 選択されているvalue属性値を取り出す 3 let val = $(this).val(); 4 let productid = $(this).data('productid'); 5 6 // valが空のとき、ここで処理を止める 7 if (!val) { 8 return false; 9 } 10 11 $.ajax({ 12 type: 'GET', 13 url: '/cart/change_quantity', // データを渡す先のルーティング 14 data: { 15 'quantity': val, 16 'productid': productid, 17 }, 18 dataType: 'json', 19 // headers: { 20 // 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 21 // }, 22 }) 23 .done(function (data) { 24 // document.getElementById('changed_cart__sub-total').textContent = '¥'+ data; 25 document.getElementById('changed_cart__sub-total').textContent = '¥' + data[0]; 26 document.getElementById('changed_cart__total-tax').textContent = '¥' + data[1]; 27 document.getElementById('changed_cart__tax-included-total').textContent = '¥' + data[2]; 28 }) 29 .fail(function () { 30 window.alert('エラー'); 31 }); 32}); 33
CartController.php
1 public function change_quantity(Request $request) { 2 $quantity = $request->quantity; 3 $productid = $request->productid; 4 $cart_id = Session::get('cart'); 5 // $line_item = LineItem::where('cart_id', $cart_id)->where('product_id', $productid)->first(); 6 $line_item = LineItem::where('cart_id', $cart_id)->where('product_id', $productid)->first(); 7 // dd($line_item); 8 9 $line_item->quantity = $quantity; 10 $line_item->save(); 11 12 $cart_id = Session::get('cart'); 13 $cart = Cart::find($cart_id); 14 $total_price = 0; 15 16 foreach ($cart->products as $product) { 17 $total_price += $product->price * $quantity; 18 } 19 20 $tax_rate = 0.1; 21 $total_tax = $total_price * $tax_rate; 22 $tax_included_total_price = floor($total_price + $total_tax); 23 24 return [$total_price, $total_tax, $tax_included_total_price, $productid]; 25 } 26
web.php
1 Route::get('/cart/change_quantity', 'CartController@change_quantity')->name('cart.change_quantity'); 2
試したこと
ajaxから送られてきた商品id($productid)をforeachで回すなどしてみましたがエラーになりました。
補足情報(FW/ツールのバージョンなど)
Laravel6、jQuery3.5.0を使用しています。

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。