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

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

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

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

Laravel

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Q&A

解決済

2回答

2263閲覧

Eloquentの入れ子(リレーション)をblade上で表示できず、エラーになってしまう。

shimadakana

総合スコア0

foreach

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

Laravel

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

0グッド

0クリップ

投稿2021/07/06 09:22

編集2021/07/07 01:40

前提・実現したいこと

PHP(Laravel)において、Eloquentデータ(多対多のリレーション)がうまく表示できません。
具体的には、@foreachにて入れ子になっているコレクション(admin_tags)のデータが拾えません。
(外側の@foreachの値は拾えています)

この場合、blade上ではどのように取得すればいいのでしょうか?

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

Invalid argument supplied for foreach() (View:XXX.blade.php)

該当のソースコード

Laravel

1XXX.blade.php の中身 2 3(略) 4@foreach($items as $item) 5 <tr> 6 <td><code>{{ $item -> url_type_name }}</code> <span><strong>{{ $item -> url }}</strong></span><br><small class="text-muted">登録日:{{ $item -> regist_date }}</small></td> 7 <td>{{ $item -> run_flg_name }}</td> 8 <td>{{ $item -> rule_type_name }}</td> 9 <td> 10 @foreach($item -> admin_tags as $tags) ←エラーが出ている箇所 11 <span class="label label-success">{{$tags -> tag_name}}</span><br> 12 @endforeach 13 </td> 14 <td> 15</tr> 16@endforeach 17(略)

試したこと

データのdumpを見る限り、「admin_tags」であっている(データ存在する)ように見えるのですが。

data

1items=[{ 2"id":1, 3"url":"http://XXX.jp/", 4"url_type":1, 5"rule_type":1, 6"run_flg":1, 7"regist_date":"2021-07-02 10:15:34", 8"created_at":"2021-07-02 10:15:34", 9"updated_at":"2021-07-02 10:15:34", 10"url_type_name":"\u5b8c\u5168\u4e00\u81f4", 11"rule_type_name":"WEB\u30a2\u30af\u30bb\u30b9", 12"run_flg_name":"\u5b9f\u884c\u5b8c\u4e86", 13"auto_rule_tags":[{ 14 15"id":1, 16"auto_rule_id":1, 17"admin_tag_id":1, 18"created_at":"2021-07-02 10:15:34", 19"updated_at":"2021-07-02 10:15:34", 20"admin_tags":{ 21 22"id":1, 23"tag_name":"XXXXX_\u914d\u4fe1\u6e08\u307f", 24"sort":1, 25"haishin_flg":1, 26"created_at":"2021-07-02 10:15:34", 27"updated_at":"2021-07-02 10:15:34" 28}}, 29 30{ 31"id":2, 32"auto_rule_id":1, 33"admin_tag_id":2, 34"created_at":"2021-07-02 10:15:34", 35"updated_at":"2021-07-02 10:15:34", 36"admin_tags":{ 37 38"id":2, 39"tag_name":"XXXXX_\u958b\u5c01", 40"sort":2, 41"haishin_flg":1, 42"created_at":"2021-07-02 10:15:34", 43"updated_at":"2021-07-02 10:15:34" 44}}, 45 46{ 47 48"id":3, 49"auto_rule_id":1, 50"admin_tag_id":10, 51"created_at":"2021-07-02 10:15:34", 52"updated_at":"2021-07-02 10:15:34", 53"admin_tags":{ 54 55"id":10, 56"tag_name":"3000\u4e07\u5186\u3000\u6238\u5efa", 57"sort":10, 58"haishin_flg":0, 59"created_at":"2021-07-02 10:15:34", 60"updated_at":"2021-07-02 10:15:34" 61}}, 62 63{ 64 65"id":4, 66"auto_rule_id":1, 67"admin_tag_id":22, 68"created_at":"2021-07-02 10:15:34", 69"updated_at":"2021-07-02 10:15:34", 70"admin_tags":{ 71 72"id":22, 73"tag_name":"\u30a4\u30a8\u30a6\u30fc\u30eb\uff08\u30a4\u30a8\u30a6\u30fc\u30eb\uff09", 74"sort":22, 75"haishin_flg":1, 76"created_at":"2021-07-02 10:15:34", 77"updated_at":"2021-07-02 10:24:24" 78 79}}]}]

※2021.7.7追記
ごめんなさい! ここに張り付けたdumpは、今の不具合が出ている時点のデータではありませんでした。

正確には、以下です(最新)。

data

1items=[{ 2 3 "id":1, 4 "url":"http://XXX.jp/", 5 "url_type":1, 6 "rule_type":1, 7 "run_flg":1, 8 "regist_date":"2021-07-02 10:15:34", 9 "created_at":"2021-07-02 10:15:34", 10 "updated_at":"2021-07-02 10:15:34", 11 "url_type_name":"\u5b8c\u5168\u4e00\u81f4", 12 "rule_type_name":"WEB\u30a2\u30af\u30bb\u30b9", 13 "run_flg_name":"\u5b9f\u884c\u5b8c\u4e86", 14 15 "admin_tags":[ 16 17 { 18 "id":1, 19 "tag_name":"XXXXX_\u914d\u4fe1\u6e08\u307f", 20 "sort":1, 21 "haishin_flg":1, 22 "created_at":"2021-07-02 10:15:34", 23 "updated_at":"2021-07-02 10:15:34", 24 "pivot":{ 25 "auto_rule_id":1, 26 "admin_tag_id":1, 27 "created_at":"2021-07-02 10:15:34", 28 "updated_at":"2021-07-02 10:15:34" 29 } 30 },{" 31 id":2, 32 "tag_name":"XXXXX_\u958b\u5c01", 33 "sort":2, 34 "haishin_flg":1, 35 "created_at":"2021-07-02 10:15:34", 36 "updated_at":"2021-07-02 10:15:34", 37 "pivot":{ 38 "auto_rule_id":1, 39 "admin_tag_id":2, 40 "created_at":"2021-07-02 10:15:34", 41 "updated_at":"2021-07-02 10:15:34" 42 } 43 },{ 44 "id":10, 45 "tag_name":"3000\u4e07\u5186\u3000\u6238\u5efa", 46 "sort":10, 47 "haishin_flg":0, 48 "created_at":"2021-07-02 10:15:34", 49 "updated_at":"2021-07-02 10:15:34", 50 "pivot":{ 51 "auto_rule_id":1, 52 "admin_tag_id":10, 53 "created_at":"2021-07-02 10:15:34", 54 "updated_at":"2021-07-02 10:15:34" 55 } 56 },{ 57 "id":22, 58     "tag_name":"\u30a4\u30a8\u30a6\u30fc\u30eb\uff08\u30a4\u30a8\u30a6\u30fc\u30eb\uff09", 59 "sort":22,"haishin_flg":1, 60 "created_at":"2021-07-02 10:15:34", 61 "updated_at":"2021-07-06 16:42:14", 62 "pivot":{ 63 "auto_rule_id":1, 64 "admin_tag_id":22, 65 "created_at":"2021-07-02 10:15:34", 66 "updated_at":"2021-07-02 10:15:34" 67 } 68 } 69 ] 70}]

あと、関連ソース(Controller、Model)も添えておきます。
Model部分の取り方がおかしい可能性もありますか?
(Laravel歴2カ月、テレワークで訊ける人がいなくて泣いてます)

Laravel

1class xxxxxController extends Controller 2 3 public function index() { 4 5 //データ抽出 6 $items = AutoRule::with('adminTags') -> get(); 7 8\Debugbar::info('items='.$items); ⇒ここで確認したデータです 9 10 return view('auto_rule_setting', ['items' => $items]); 11 } 12(以下略)

Laravel

1class AutoRule extends Model { 2 3 public function adminTags() { 4 return $this -> belongsToMany(AdminTag::class, 5 'admin_tag_auto_rule', 6 'auto_rule_id', 7 'admin_tag_id') -> withTimestamps(); 8 } 9(以下略)

Laravel

1class AdminTag extends Model { 2 3 public function autoRules() { 4 return $this -> belongsToMany(AutoRule::class, 5 'admin_tag_auto_rule', 6 'admin_tag_id', 7 'auto_rule_id'); 8 } 9(以下略)

やりたいことは、[auto_rules]のIDと一致する中間テーブルのデータを一緒に取得([admin_tag]とIDが一致するnameも取得)して、一覧に並べることです。
[admin_tags]
admin_tags
[admin_tag_auto_rule(中間TABLE)]
admin_tag_auto_rule(中間TABLE)
[auto_rules]
auto_rules

補足情報(FW/ツールのバージョンなど)

Laravel 6.0
MySQL(MariaDB) 10.4.14

(2021.7.7追記)
ちなみに、blade上で[$item -> admin_tags]をdumpしたところ[NULL]と出ました……。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/07/06 09:32

auto_rule_tagsの中にあるけど、それをすっ飛ばしてアクセスしようとしているためでは?
shimadakana

2021/07/07 01:23

ごめんなさい!張り付けたdumpは最新ではありませんでした。 最新のdumpと関連ソースも載せました。
guest

回答2

0

自己解決

【自己解決】
blade上で[$item]のdumpを取ってみたら、なぜか[admin_tags]が[adminTags]と表記されていたので、以下に直したところ、あっさり解決しました(値を拾って表示できました)。
@foreach($item -> admin_tags as $tags)

@foreach($item -> adminTags as $tags)

Controllerからbladeへeloquentが送られると、keyの表記が変わるのでしょうか?
知りませんでした……。

この度はお騒がせしてすみません。精進しますm(__)m

投稿2021/07/07 01:51

shimadakana

総合スコア0

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

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

0

foreachした中での$itemにどの様な値が入っているかを確認してみましょう。- Live Demo

<?php $item = [ "id" => 1, "url" => "http=> //XXX.jp/", "url_type" => 1, "rule_type" => 1, "run_flg" => 1, "regist_date" => "2021-07-02 10=> 15=> 34", "created_at" => "2021-07-02 10=> 15=> 34", "updated_at" => "2021-07-02 10=> 15=> 34", "url_type_name" => "\u5b8c\u5168\u4e00\u81f4", "rule_type_name" => "WEB\u30a2\u30af\u30bb\u30b9", "run_flg_name" => "\u5b9f\u884c\u5b8c\u4e86", "auto_rule_tags" => [ [ "id" => 1, "auto_rule_id" => 1, "admin_tag_id" => 1, "created_at" => "2021-07-02 10=> 15=> 34", "updated_at" => "2021-07-02 10=> 15=> 34", "admin_tags" => [ "id" => 1, "tag_name" => "XXXXX_\u914d\u4fe1\u6e08\u307f", "sort" => 1, "haishin_flg" => 1, "created_at" => "2021-07-02 10=> 15=> 34", "updated_at" => "2021-07-02 10=> 15=> 34" ] ], ] ]; foreach ($item->auto_rule_tags as $auto_rule_tag) { foreach ($auto_rule_tag->admin_tags as $admin_tag) { echo $admin_tag; } }

投稿2021/07/06 12:13

編集2021/07/06 12:14
kai0310

総合スコア2076

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

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

shimadakana

2021/07/07 01:23

ごめんなさい!張り付けたdumpは最新ではありませんでした。 最新のdumpと関連ソースも載せました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問