質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

7234閲覧

formから複数のレコードを更新したい

HirakuMorishima

総合スコア29

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/07/05 06:41

編集2019/07/05 12:06

複数の<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についても参照したのですが、問題が分かりませんでした…。再度、助言いただけましたら幸いです。

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

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

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

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

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

guest

回答3

0

以下で想定通りの挙動を確認できました。ありがとうございました。

・Controller

php

1 $i = 0; 2 foreach($request->bill_id as $id){ 3 $bill = Bill::find($id); 4 $bill->billing_item = $request->billing_item[$i]; 5 $bill->unit = $request->unit[$i]; 6 $bill->quantity = $request->quantity[$i]; 7 $bill->bill_unit_price = $request->bill_unit_price[$i]; 8 $bill->save(); 9 $i++; 10 }

・Blade

php

1 $i = 0; 2 foreach($request->bill_id as $id){ 3 $bill = Bill::find($id); 4 $bill->billing_item = $request->billing_item[$i]; 5 $bill->unit = $request->unit[$i]; 6 $bill->quantity = $request->quantity[$i]; 7 $bill->bill_unit_price = $request->bill_unit_price[$i]; 8 $bill->save(); 9 $i++; 10 }

投稿2019/07/05 22:19

HirakuMorishima

総合スコア29

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

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

0

ベストアンサー

formで複数のレコードを扱う場合は、form内のinputのnameを配列にしてあげると可能です。

#bills[id または index][properly] name="bills[1][billing_item]" name="bills[1][quantity]"

PHP HTML フォームで配列を使用するにはどうすればよいですか?

その後、リクエストデータをforeachで回すと良いです。

foreach($request->input("bills") as $id=>$bill){ //処理 }

投稿2019/07/05 06:53

aro10

総合スコア4106

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

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

0

まずはSQLのテーブル構成とサンプルデータをつくり
具体的などういったデータを元にどう更新したいかSQL文を作るところからですね

投稿2019/07/05 06:50

yambejp

総合スコア114843

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問