laravelでデータの複数送信しようとしています。
しようとしていること
Shop/editで店(Shopテーブル)の更新(今回はコードを載せてない)、
商品(Commodityテーブル)の新規追加と更新(すでに保存されている商品の名前変更など)を同時にしようとしています。
商品の新規追加はformをjsで増やしすべて保存したいです。
また商品の更新も同時に行いたいです。
コードは書いてませんが画像(Imageテーブル)の複数送信もしようとしています。
わからないこと
for文を使わずに配列に格納する方法
商品を保存する際のupdataOrCreateを使う方法
jsを使ってフォーム追加したときの複数送信の仕方
別の質問
edit.blade.phpで@for($i = 0 ; $i < hoge; $i ++)を書き
hogeの部分をjsでボタンを押した回数によって増減させる方法(非同期で)が知りたいです。
参考にしたもの
https://teratail.com/questions/198804
https://nekorokkekun.hatenablog.com/entry/2019/07/12/125556
わかりずらい部分がありましたら訂正します。
よろしくお願いいたします。
Shop/edit.blade.php
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script type="text/javascript" src="//code.jquery.com/jquery-3.5.0.min.js"></script> <script src="{{ asset('/js/shop.js') }}" defer></script> </head> <body> <form method="POST" action="{{url('Shop/update')}}" enctype="multipart/form-data"> {{ csrf_field() }} <!-- @method('PUT') --> <!-- 商品更新 --> @foreach ($commodity as $com) <label for="com-name"> 商品 </label> <input id="com-name" name="com-name[]" class="com-name" value="{{ old('com-name', $com->name) }}" type="text" > <label for="com-price"> 金額 </label> <input id="com-price" name="com-price[]" class="com-price" value="{{ old('com-price', $com->price) }}" type="text" > <label for="description"> 商品紹介 </label> <textarea id="description" name="description[]" class="com-description" rows="4" >{{ old('description', $com->description) }}</textarea> @endforeach <!-- 新規商品 --> <p> 新規商品数<span id="press-button">1</span>個 </p> <div id="input_pluralBox"> <div id="input_plural" data-index=1> <label for="com-name"> 商品 </label> <input id="com-name" name="com-name[]" class="com-name" value="{{ old('com-name') }}" type="text" > <label for="com-price"> 金額 </label> <input id="com-price" name="com-price[]" class="com-price" value="{{ old('com-price') }}" type="text" > <label for="description"> 商品紹介 </label> <textarea id="description" name="description[]" class="com-description" rows="4" >{{ old('description') }}</textarea> <input type="button" value="+" class="add pluralBtn"> <input type="button" value="-" class="del pluralBtn"> </div> </div> </div> <div class="mt-5"> <a class="btn btn-secondary" href="{{ action('ShopController@show', $shop->id) }}"> キャンセル </a> <button type="submit" class="btn btn-primary"> 更新する </button> <input type="hidden" name="_token" value="{{csrf_token()}}"> <input type="hidden" name="id" value="{{$shop->id}}"> <input type="hidden" name="ids" value="{{$commodities}}"> </form> </div> </body> </html>
ShopController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Collection; use App\Shop; use App\Image; use App\Commodity; use App\Review; class ShopController extends Controller { public function edit($id) { $shop = Shop::findOrFail($id); $commodity = Commodity::where('shop_id', $id)->get(); $commodities = collect($commodity)->count(); return view('shop.edit', ['shop' => $shop, 'commodity' => $commodity, 'commodities' => $commodities]); } public function update(Request $request) { $value = Shop::findOrFail($request->id); $value->fill($request->all())->save(); foreach ($request->num as $id) { $com = new Commodity; echo var_dump($request->name[$i]); $com->name = $request->input('name[$i]'); $com->price = $request->input('com-price'[$i]); $com->description = $request->input('description'[$i]); $com->save(); $i++; } $reviews = Review::all(); $review = Review::select('evaluation')->get(); $review = collect($review)->avg('evaluation'); return view('shop.show', ['shop' => $value, 'review' => $review, 'reviews' => $reviews]); } }
shop.js
<!-- 新規商品のフォーム追加コード --> var count_value = 1; $(document).on("click", ".add", function() { $(this).parent().clone(true).insertAfter($(this).parent()); count_value++; document.getElementById("press-button").innerHTML = count_value; }); $(document).on("click", ".del", function() { var target = $(this).parent(); if (target.parent().children().length > 1) { target.remove(); count_value--; document.getElementById("press-button").innerHTML = count_value; } });
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。