複数の<input>タグからフォームに送信を実行すると、最後に送信したデータの内容が全てのレコードに反映されてしまうという問題で困っています。
原因または解決策をご存知の方はいらっしゃいませんか。
私の行った手順は以下です。
(1)同一テーブルカラムの中にある複数のレコードに更新処理を掛けるFormの記述
(2)Controller側で受け取ったデータを「$a = 〇〇::where(‘id’, ‘=’, $request->id)->get();」という形で受け取り、foreachで展開。
(3)カラムごとに「$a->xx = $request->xx;」という形でRequestを受け取り、最後にsave()メソッドで更新。
すると、全てのレコードが最後に送信したデータの内容になってしまうという状況になりました。
私は【foreachで展開して、それぞれsaveをしているため、where(‘id’, ‘=’, $request->id)で各レコードが区別されて、それぞれレコードが対応したデータに更新する】と思いました。
原因を確かめるため、以下のようなテストを行ってみましたが、
問題の解決には至りませんでした。
(a) 入力を「$a = 〇〇::where(‘id’, ‘=’, $request->id)->first();」にし、foreachでの展開をやめてみた
→上記と同じく全てのレコードが最後に送信したデータの内容になってしまうという状況になった。
なお、私の環境は以下の通りです。
【MacBook Air (13-inch, Early 2015), 8 GB 1600 MHz DDR3, AWS, Laravel5.8.21】
検索エンジンで「laravel レコード 複数挿入 form」などのキーワードを使用して検索しましたが、
formから受け取ったデータを複数挿入する方法などについては見つかりませんでした。
以下に該当コードを抜粋して記載いたしますので、何卒解決策やアドバイスをいただきますよう、よろしくお願いいたします。
●Controller
php
1public function makeInvoice(Request $request, $invoiceId, $clientId) 2 { 3: 4: 5 $bills = Bill::where('invoice_id', '=', $request->bill_invoice_id)->get(); 6 foreach($bills as $bill){ 7 $bill->billing_item = $request->billing_item; 8 $bill->unit = $request->unit; 9 $bill->quantity = $request->quantity; 10 $bill->bill_unit_price = $request->bill_unit_price; 11 $bill->save(); 12 } 13: 14: 15} 16
●blade(foreachで該当レコード分だけinputタグが出てくるようにしています。)
php
1{{Form::open(['url' => route('makeInvoice',['clientId'=>$val->client_id, 'invoiceId' => $val->id]),'method'=>'POST', 'target'=>'_blank'])}} 2 {{ csrf_field() }} 3: 4: 5 <tr> 6 <!--品番・品名--> 7 <td>{{Form::text('billing_item', $val->billing_item,['class' => 'validate', 'id' => 'billing_item'])}}</td> 8 <!--数量--> 9 <td>{{Form::text('quantity', $val->quantity,['class' => 'validate', 'id' => 'quantity'])}}</td> 10 <!--単位--> 11 <td>{{Form::text('unit', $val->unit,['class' => 'validate', 'id' => 'unit'])}}</td> 12 <!--単価--> 13 <td>{{Form::text('bill_unit_price', ceil($val->bill_unit_price),['class' => 'validate', 'id' => 'bill_unit_price'])}}</td> 14 <!--金額--> 15 <td>{{$val->quantity * $val->bill_unit_price}}</td> 16 <td><a href="#" data-id="{{$val->id}}" class="waves-effect waves-light btn del">削除</a> 17 </td> 18 {{Form::hidden('bill_invoice_id', $val->invoice_id)}} 19 </tr> 20: 21: 22 {{Form::close()}}
・・・追記
manualには、
name属性(例えばbilling_item)に対して[]を付ければ、
indexが数値として入るとのことでしたので、以下のようにbladeを変更しました。
php
1@foreach($billList as $val) 2 <tr> 3 <!--品番・品名--> 4 <td>{{Form::text('billing_item[]', $val->billing_item,['class' => 'validate', 'id' => 'billing_item'])}}</td> 5 <!--数量--> 6 <td>{{Form::text('quantity[]', $val->quantity,['class' => 'validate', 'id' => 'quantity'])}}</td> 7 <!--単位--> 8 <td>{{Form::text('unit[]', $val->unit,['class' => 'validate', 'id' => 'unit'])}}</td> 9 <!--単価--> 10 <td>{{Form::text('bill_unit_price[]', ceil($val->bill_unit_price),['class' => 'validate', 'id' => 'bill_unit_price'])}}</td> 11 <!--金額--> 12 <td>{{$val->quantity * $val->bill_unit_price}}</td> 13 <td><a href="#" data-id="{{$val->id}}" class="waves-effect waves-light btn del">削除</a> 14 </td> 15 {{Form::hidden('bill_invoice_id', $val->invoice_id)}} 16 </tr> 17 <?php $subtotal += $val->bill_unit_price; ?> 18 @endforeach
また、Controllerを以下のように変更しました。
php
1 $bills = Bill::where('invoice_id', '=', $request->bill_invoice_id)->get(); 2 foreach($request->input("bills") as $id => $bill){ 3 $bill->billing_item = $request->billing_item; 4 $bill->unit = $request->unit; 5 $bill->quantity = $request->quantity; 6 $bill->bill_unit_price = $request->bill_unit_price; 7 $bill->save(); 8 }
しかし、ソースコードを確認するとarray[]の中が空欄となっていました。
https://php.net/manual/ja/faq.html.php#faq.html.arraysについても参照したのですが、問題が分かりませんでした…。再度、助言いただけましたら幸いです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。