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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

1113閲覧

【Laravel】【MYSQL】取得したIDから他のデータを取得する方法

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2020/04/27 08:39

初めての投稿になります。Laravelを始めて1か月です。
至らない点もあると思いますが、よろしくお願いします。

前提・実現したいこと

Laravel、MYSQLでレシピ検索のホームページを作成しています。
登録してあるレシピのページを表示させたいです。

DB
テーブル recipes
id | auto_increment | primary key
name |varchar

テーブル foods
id | auto_increment | primary key
name | varchar
num | varchar
recipe_id | int

recipes と foods は1対多のリレーション関係

発生している問題・エラーメッセージ

テーブルrecipesのidを取得しURLに埋め込み。
リレーション先のname と numには複数データが入っており、recipe_id = 1のときは当てはまるものを取得したいのですが上手くいきません。

該当のソースコード

controller

1 2public function page(Request $request, $id) 3 { 4 //URLにidを埋め込み表示 5 $recipe = Recipe::findOrFail($id); 6 7 $food = Food::where('recipe_id', $id)->get(); 8 9 return view('/') 10 ->with('recipe', $recipe)->with('food', $food); 11 }

view

1<div class="recipe_list"> 2 <div class="re_photo"> 3 <img src="{{asset($recipe->photo)}}" width="250px" height="auto"> 4 </div> 5 <div class="re_na_fo"> 6 <div class="re_name"><h1>{{ $recipe->name}}</h1></div> 7 <div class="re_food"> 8 <table> 9 <thead> 10 <tr> 11 <th scope="col">材料</th> 12 <th scope="col">量</th> 13 </tr> 14 </thead> 15 <tbody> 16 <tr> 17 <td data-label="材料" class="zairyo"><span>{{$food->name}}</span></td> 18 <td data-label="量" class="kazu">{{$food->num}}</td> 19 </tr> 20 </tbody> 21 </table> 22 </div> 23 </div> 24</div>

試したこと

公式ドキュメントや他の方のサイトを参考にいろいろ試してみましたが、探していることに当てはまるものがありませんでした。
$idは決まっているので $food = Food::all();で取得すると$idのすべてが出るのではないかと思ってやってみたり、
if('recipe_id', $id){などif文を使うのか、いろいろ試してみたのですが、エラーが出るばかりです。

$id = recipe_idでidの値は取れているのであとは紐づけて表示させるだけという考え方なのですが、考え方がまず違いますか?
アドバイスをよろしくお願いします。

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

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

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

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

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

rozeo_s

2020/04/27 08:54

findOrFailは結果がなければその時点で例外を出して終了するので、 'id' = $idなレシピのデータがないや、'recipe_id' = $idなデータがいないとかではないですか?
退会済みユーザー

退会済みユーザー

2020/04/27 10:16

コメントありがとうございます。 $idのデータ取得はできています。 foodsテーブルのname や numには$idに紐づくデータが複数あるのでそれを取得するための考え方が知りたかったのです。 言葉が足りずわかりにくい中、コメントをくださりありがとうございました。 内容を分かりやすく修正します。
rozeo_s

2020/04/27 10:17

あ、申し訳なかったです、recipe_idのデータは取れてるというのを見落としてたもんで申し訳ないです
guest

回答1

0

ベストアンサー

エラー原因(?)

エラーの内容が書かれていないので推測になりますが、

php

1$food = Food::where('recipe_id', $id)->get();

で取得した結果は、FoodクラスでなくFoodクラスの配列です。
※結果的に1件しかなかったとしても「データが1件しかない配列」になります。

そのため、viewで
{{$food->name}}
しようとしても、$foodは「配列」なので、その配列自体には name という項目が存在せず、エラーになります(「配列のn番目の値」であれば、Foodクラスなので、nameという項目があります)。

修正内容

コントローラー

変数名をfood→foodsに変更(名前以外は変えていません)

controller

1// $food = Food::where('recipe_id', $id)->get(); 2$foods = Food::where('recipe_id', $id)->get(); 3 4// return view('/') 5// ->with('recipe', $recipe)->with('food', $food); 6return view('/') 7 ->with('recipe', $recipe)->with('foods', $foods);

ビュー

<tr>タグの回りに @foreach / @endforeachを追加(取得した配列の中身を1件ずつ処理する)

view

1@foreach ($foods as $food) // 追加($foods配列の中から1件ずつ$foodを取得し、処理を繰り返す 2<tr> 3 <td data-label="材料" class="zairyo"><span>{{$food->name}}</span></td> 4 <td data-label="量" class="kazu">{{$food->num}}</td> 5</tr> 6@endforeach // 追加 7

参考URL:
下記サイトの「繰り返し」項を参照のこと。
https://readouble.com/laravel/5.5/ja/blade.html

余談

技術系のQAサイトを利用される場合、「うまくいきません」「エラーになりました」よりも、「○○をしたところ、××というエラーメッセージ/エラーログが出ました」のほうが回答がつきやすくなるのでおススメです(エラーになった……だけだと、どんなエラーだかわからない→回答者が原因を推測するしかなくなるため)。

公式の「質問するときのヒント」というページがありますので、こちらをご一読いただくと良いかもしれません。
https://teratail.com/help/question-tips

投稿2020/04/27 09:56

nak

総合スコア696

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

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

退会済みユーザー

退会済みユーザー

2020/04/27 10:34

コメントありがとうございます。 無事にデータ取得と表示されることができました!!! return view (~略~) with(food, $foods); でやっていました。 詳しい説明をしてくださり、foreach文やリンクもありがとうございます。 調べても思ったものと違うのが多くお手上げ状態でした、、、 こちらを利用することがあれば、質問の書き方を参考にしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問