##課題
Laravelのビュー上で、テーブルから「特定のレコード」を取得する方法が分からず困っています。
原因または解決策をご存知の方はいらっしゃいませんか。
##問題に至る手順
私の行った手順は以下です。
(1)itemテーブル、Clientテーブル、InvoiceテーブルをそれぞれController上で、$list、$clientList、$invoiceListとして、ビューである「items.blade.php」に受け渡した。
(2)「items.blade.php」で$list、$clientList、$invoiceListをforeachを使用して表示、また、formを使用して$list、$invoiceListを別テーブルbillに保存する処理をした。
(3)$list、$invoiceListを別テーブルbillに保存する処理を行う「addInvoice」アクションの中で、formから受け渡されたrequestのデータを、itemテーブル、billテーブルに保存した。
すると、【billテーブルに保存した$request->item_name、$request->bill_unit_priceがどちらもitemテーブルの最後のレコードからデータを取得して保存してしまう】というような結果になりました。
##お尋ねしたい点
foreachで展開したitemテーブルのレコードからデータの取得をして、別テーブル(billテーブル)に保存しているため、最後のカラムが取得されてしまうということは理解できたのですが、
ビュー上で
【itemテーブル上の「指定したレコード」からデータを取得する方法】
が分かりません。
##環境
なお、私の環境は以下の通りです。
【MacBook Air (13-inch, Early 2015), 8 GB 1600 MHz DDR3, macOS Mojave 10.14.5, AWS, Laravel5.8.21】
##問題後のリサーチ
検索エンジンで「ビューで指定のレコード 取得 laravel」などのキーワードで検索しましたが、
Controller上でデータを取得する方法に関するページばかりで、解決に役立つ情報は見つかりませんでした。
##コード
以下、該当のコードとなります。
●items.blade.php(一部抜粋)
php
1<h3>{{$client->client_name}}</h3> 2 <table class="highlight centered"> 3 <thead> 4 <tr> 5 <th>案件名</th> 6 <th>納期</th> 7 <th>単価</th> 8 <th>ステータス</th> 9 <th>メモ</th> 10 <th>編集・削除</th> 11 </tr> 12 </thead> 13 <tbody> 14 <!--変数化して、formsのindex番号を割り振るための$index--> 15 <?php $index = 0; ?> 16 @foreach($list as $val) 17 <tr> 18 <th>{{$val->item_name}}</th> 19 <th>{{$val->delivery_date}}</th> 20 <th>{{$val->unit_price}}円</th> 21 <th> 22 <form method="POST" action="/updateItemStates/{{$val->id}}" id="states_form"> 23 {{csrf_field()}} 24 <div class="input-field col s12"> 25 <select id="states" class="select" name="states" onchange="modalOpen{{$val->id}}()"> 26 <option value="1" {{$val->states == '1' ? 'selected' : ""}}>未執筆</option> 27 <option value="2" {{$val->states == '2' ? 'selected' : ""}}>請求書挿入</option> 28 </select> 29 <label for="states">ステータス</label> 30 </div> 31 </form> 32 <script> 33 function modalOpen{{$val->id}}() { 34 //alert(document.forms[{{$loop->index - 1}}].states.selectedIndex); 35 if(document.forms[{{$index}}].states.selectedIndex==1){ 36 //document.getElementById('states').selectedIndex 37 document.modal_form.item_id.value = '{{$val->id}}'; 38 $('#modal01').modal('open'); 39 } 40 } 41 </script> 42 <?php $index ++; ?> 43 </th> 44 <th>{{$val->memo}}</th> 45 <th><a href="/editItem/{{$val->id}}">管理画面</a></th> 46 </tr> 47 @endforeach 48 </tbody> 49 </table> 50 </div> 51 </div> 52 <!--請求書選択モーダル--> 53 <div class="modal" id="modal01"> 54 <div class="overLay modalClose"></div> 55 <div class="inner"> 56 {{Form::open(['url' => 'addInvoice', 'id' => 'modal_select', 'name' => 'modal_form' ])}} 57 {{ csrf_field() }} 58 <select name="invoice_id" class="select" onchange="submit(this.form)"> 59 @foreach($invoiceList as $val) 60 <option value="{{$val->id}}">{{$val->invoice_title}}</option> 61 @endforeach 62 </select> 63 <label for="client_id">登録先の請求書</label> 64 <button type="submit" class="btn btn-primary">請求書へ挿入</button> 65 {{Form::hidden('item_id', '')}} 66 {{Form::hidden('states', '2')}} 67 {{Form::hidden('client_id', $client->id)}} 68 @foreach($list as $val) 69 {{Form::hidden('item_name', $val->item_name)}} 70 {{Form::hidden('bill_unit_price', $val->unit_price)}} 71 @endforeach 72 {{Form::close()}} 73 <a href="" class="modalClose">Close</a> 74 </div> 75 </div>
●TodoController@items(items.bladeにデータを渡しています。)
php
1public function items($id){ 2 $list = Item::where('client_id', '=', $id)->get(); 3 $client = Client::find($id); 4 $invoiceList = Invoice::all(); 5 return view('todo.items', compact('list','client', 'invoiceList')); 6 }
●InvoiceController@addInvoice(itemテーブルとbillテーブルへformデータを保存しています。)
php
1public function addInvoice(Request $request){ 2 // 案件ID(Item_ID)を一つもらって、その案件のステータスを変更する。請求ヘッダIDを入れる。 3 $item = Item::find($request->item_id); 4 $item->states = $request->states; 5 $item->invoice_id = $request->invoice_id; 6 $item->save(); 7 // 請求明細の追加 88行目を参考にする 8 $bill = new Bill(); 9 $bill->invoice_id = $request->invoice_id; 10 $bill->billing_item = $request->item_name; 11 $bill->quantity = 1; 12 $bill->bill_unit_price = $request->bill_unit_price; 13 $bill->unit = '本'; 14 $bill->save(); 15 //請求ヘッダの金額、数量の再計算 111行目を参考にする(アップデート) 16 //もう1度、案件一覧表示 17 //$client = $item->client->client_name; 18 $list = Item::where('client_id', '=', $request->client_id)->get(); 19 $client = Client::find($request->client_id); 20 $invoiceList = Invoice::all(); 21 return view('todo.items', compact('list', 'client', 'invoiceList')); 22 }
回答1件
あなたの回答
tips
プレビュー