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

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

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

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

PHP

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

Q&A

解決済

1回答

6001閲覧

Laravelのビュー上でテーブルから特定のレコードを取得する方法

HirakuMorishima

総合スコア29

Laravel

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

PHP

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

0グッド

0クリップ

投稿2019/06/30 01:12

##課題
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 }

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

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

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

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

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

m.ts10806

2019/06/30 01:43

>Controller上でデータを取得する方法に関するページばかりで それは役割分担の観点からView「コントローラから渡されてきたデータを表示するもの」であるからに他ならないですし、今回もわざわざViewから直接取得処理を書かなければならないようにも見えません。 もちろんbladeからLaravelの機能、PHPの標準関数を使えるのでできないことはないと思うのですが、 もうちょっとロジックを整理すればもっと簡単にできそうにも思います(私もまだ質問要件を完全に把握し切れているわけではないのですぐすぐ的確なアドバイスができるわけではないですが)
退会済みユーザー

退会済みユーザー

2019/06/30 03:16

MacなのかAWSなのかどっちですか?
退会済みユーザー

退会済みユーザー

2019/06/30 03:22

すみませんが何回読んでも何がしたいのかがわかりませんでした。 > itemテーブル上の「指定したレコード」からデータを取得する方法 これは具体的にどういうことですか? 「指定したレコード」の指定とはどういう指定ですか?
HirakuMorishima

2019/06/30 06:06

mtsさん >役割分担の観点からView「コントローラから渡されてきたデータを表示するもの」であるからに他ならない ご指摘ありがとうございます。 自分自身で整理をしてみます。
HirakuMorishima

2019/06/30 06:20 編集

dyoshikawaさん >MacなのかAWSなのかどっちですか? Mac上でAWSを使用しているという意味です。 >これは具体的にどういうことですか? たとえば、 billというテーブルに5つのレコードが挿入されている状態で、 3番目(id=3)のレコードからデータを抽出する ということを行いたいと考えています。 >「指定したレコード」の指定とはどういう指定ですか? 上記の通りです。 >すみませんが何回読んでも何がしたいのかがわかりませんでした。 また、何度も確認くださったようでありがとうございました。 書き方の問題かと思いますので、お時間お取りするようであればスルーくださいませ。
guest

回答1

0

自己解決

以下のコードで自己解決しました。

●items.blade.php(モーダル部分のみ抜粋)

php

1 <!--請求書選択モーダル--> 2 <div class="modal" id="modal01"> 3 <div class="overLay modalClose"></div> 4 <div class="inner"> 5 {{Form::open(['url' => 'addInvoice', 'id' => 'modal_select', 'name' => 'modal_form' ])}} 6 {{ csrf_field() }} 7 <select name="invoice_id" class="select" onchange="submit(this.form)"> 8 @foreach($invoiceList as $val) 9 <option value="{{$val->id}}">{{$val->invoice_title}}</option> 10 @endforeach 11 </select> 12 <label for="client_id">登録先の請求書</label> 13 <button type="submit" class="btn btn-primary">請求書へ挿入</button> 14 {{Form::hidden('item_id', '')}} 15 {{Form::hidden('states', '2')}} 16 {{Form::hidden('client_id', $client->id)}} 17 @foreach($list as $val) 18 @endforeach 19 {{Form::close()}} 20 <a href="" class="modalClose">Close</a> 21 </div> 22 </div>

●InvoiceController@addInvoice(itemテーブルとbillテーブルへformデータを保存しています。)

php

1 // 請求書にItemのデータを挿入する 2 public function addInvoice(Request $request){ 3 // 案件ID(Item_ID)を一つもらって、その案件のステータスを変更する。請求ヘッダIDを入れる。 4 $item = Item::find($request->item_id); 5 $item->states = $request->states; 6 $item->invoice_id = $request->invoice_id; 7 $item->save(); 8 9 // 請求明細の追加 88行目を参考にする 10 $bill = new Bill(); 11 $bill->invoice_id = $request->invoice_id; 12 $bill->billing_item = $item->item_name; 13 $bill->quantity = 1; 14 $bill->bill_unit_price = $item->unit_price; 15 $bill->unit = '本'; 16 $bill->save();

addInvoiceの最初に呼び出していたItemデータが、Billテーブルのレコードに挿入したいものでしたので、そのまま呼び出すことができました。

投稿2019/06/30 06:34

HirakuMorishima

総合スコア29

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問