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

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

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

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

Laravel

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

PHP

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

Q&A

解決済

2回答

2210閲覧

【Laravel6】foreachループ内で親テーブルのidを判別し、子テーブルの該当するレコードを取得したい

zono3

総合スコア16

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

Laravel

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

PHP

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

0グッド

0クリップ

投稿2021/08/04 11:40

前提・実現したいこと

【前提】
親テーブル(foldersテーブル)
カラム↓
・id
・name
・description

子テーブル(categoriesテーブル)
カラム↓
・id
・folder_id
・name

【実現したいこと】
・親テーブルのすべてのレコードをforeach文で表示
・親テーブルのidと子テーブルのfolder_idが一致する子テーブルのレコードをforeach文で表示

そもそもの考え方が違う場合、どう考えれば実現できるのかだけでも教えていただければ助かります!

試したこと

board.blade.php

php

1<ul> 2 <!-- 親テーブル繰り返し --> 3 @foreach($folder as $folder) 4 <li class="mb-4"> 5 <div class="parent folder-name" data-toggle="collapse" data-target="#target{{ $folder->id }}" aria-expand="false" aria-controls="#target{{ $folder->id }}"><i class="fas fa-caret-right mr-3 triangle"></i>{{ $folder->name }}</div> 6 <div class="child collapse" id="target{{ $folder->id }}"> 7 <ul class="create-category-items p-0"> 8 <!-- 子テーブル繰り返し --> 9 @if($folder->id == $category->folder_id) 10 @foreach($category as $category) 11 <li class="mt-3"> 12 <div class="d-flex justify-content-lg-between parent category-name" data-toggle="collapse" data-target="#target1-1" aria-expand="false" aria-controls="#target1-1"> 13 <div class="category-left d-flex align-items-center"> 14 <i class="fas fa-caret-right mr-3 triangle"></i> 15 <p>{{$category->name}}</p> 16 </div> 17 <div class="category-right d-flex justify-content-end mb-1 cursor-default cursor-default"> 18 <a href="#">編集</a> 19 <div class="mx-2">|</div> 20 <a href="" class="text-danger" data-toggle="modal" data-target="#">削除</a> 21 </div> 22 </li> 23 @endforeach 24 @endif 25 </ul> 26 </div> 27 </li> 28 @endforeach 29</ul> 30 31

Controller.php

php

1public function board(Request $request) 2{ 3 $folder = Folder::all(); 4 $category = Category::all(); 5 return view("/admin/board", [ 6 'folder' => $folder, 7 'category' => $category, 8 ]); 9} 10

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

Property [folder_id] does not exist on this collection instance. (View: /work/resources/views/admin/board.blade.php)

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

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

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

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

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

guest

回答2

0

ベストアンサー

このように書くととりあえず動くかもしれません。テスト等できていませんが、一度検証していただけると幸いです。

<ul> <!-- 親テーブル繰り返し --> @foreach($folder as $folder) <li class="mb-4"> <div class="parent folder-name" data-toggle="collapse" data-target="#target{{ $folder->id }}" aria-expand="false" aria-controls="#target{{ $folder->id }}"><i class="fas fa-caret-right mr-3 triangle"></i>{{ $folder->name }}</div> <div class="child collapse" id="target{{ $folder->id }}"> <ul class="create-category-items p-0"> <!-- 子テーブル繰り返し --> @foreach($category as $category) @if($folder->id == $category->folder_id) <li class="mt-3"> <div class="d-flex justify-content-lg-between parent category-name" data-toggle="collapse" data-target="#target1-1" aria-expand="false" aria-controls="#target1-1"> <div class="category-left d-flex align-items-center"> <i class="fas fa-caret-right mr-3 triangle"></i> <p>{{$category->name}}</p> </div> <div class="category-right d-flex justify-content-end mb-1 cursor-default cursor-default"> <a href="#">編集</a> <div class="mx-2">|</div> <a href="" class="text-danger" data-toggle="modal" data-target="#">削除</a> </div> </li> @endif @endforeach </ul> </div> </li> @endforeach </ul>

ちなみに、このような親テーブルに関連付けられている子テーブルの一覧を取得する操作はよく行われるため、Laravelには簡単に実装できる機能が備わっています。
こちらのリレーションに関する記事を参考にされると良いかと思います。
https://laraweb.net/practice/4369/

こちらの方が簡潔かつ、viewが複雑にならないので良いと思います。

投稿2021/08/05 01:48

編集2021/08/05 01:52
bktclvy

総合スコア63

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

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

zono3

2021/08/05 02:27

提示していただいた書き方で解決しました。 助かりました、ありがとうございます!
guest

0

ループ内で展開しようとしている配列やオブジェクトの値と、中で展開する変数の値を一緒にするのはやめましょう。それが原因でエラーを見逃しています。

php:php

1@foreach($folder as $vfolder) 2 <li class="mb-4"> 3 <div class="parent folder-name" data-toggle="collapse" data-target="#target{{ $vfolder->id }}" aria-expand="false" aria-controls="#target{{ $vfolder->id }}"><i class="fas fa-caret-right mr-3 triangle"></i>{{ $vfolder->name }}</div> 4 <div class="child collapse" id="target{{ $vfolder->id }}"> 5 <ul class="create-category-items p-0"> 6 <!-- 子テーブル繰り返し --> 7 @if($vfolder->id == $vcategory->folder_id) 8 @foreach($category as $vcategory) 9 <li class="mt-3"> 10 <div class="d-flex justify-content-lg-between parent category-name" data-toggle="collapse" data-target="#target1-1" aria-expand="false" aria-controls="#target1-1"> 11 <div class="category-left d-flex align-items-center"> 12 <i class="fas fa-caret-right mr-3 triangle"></i> 13 <p>{{$vcategory->name}}</p> 14 </div> 15 <div class="category-right d-flex justify-content-end mb-1 cursor-default cursor-default"> 16 <a href="#">編集</a> 17 <div class="mx-2">|</div> 18 <a href="" class="text-danger" data-toggle="modal" data-target="#">削除</a> 19 </div> 20 </li> 21 @endforeach 22 @endif 23 </ul> 24 </div> 25 </li> 26@endforeach

このように名前を振り分けると、二度目のループの外側で存在しないループ内のメンバにあるはずのfolder_idを呼び出そうとしているのがわかると思います。

php:php

1 2@if($vfolder->id == $vcategory->folder_id) //ループの外側なので、未定義 3 @foreach($category as $vcategory) 4

投稿2021/08/05 01:43

FKM

総合スコア3647

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

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

zono3

2021/08/05 02:29

実はベストアンサーにさせていただいた方の書き方だけでは解決せず、FKMさんからのヒントのおかげもあり、解決しました! この度はご回答ありがとうございました。助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問