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

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

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

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

Laravel 5

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

Q&A

解決済

1回答

3450閲覧

複数のオブジェクトを,同時にforeachする OR 一つにまとめる には(データベース)

riz

総合スコア30

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2019/03/17 08:09

前提・実現したいこと

Laravelを用いて商品検索システムのようなものを作っています。
店名(shops)と支店名(branches)を一対多で対応させ,支店名(branches)と商品(items)を多対多で対応させる以下のような構成をとっています。
ER図

検索ボックスから商品名を入力して,商品→支店名→店名と対応するものをすべて辿って一覧表示させたいと考えています。
↓イメージ
イメージ

発生している問題

検索ボックスに入れた商品名から,対応する支店名群,店名群のオブジェクトをそれぞれ取り出すことまでは出来たのですが,
これらのオブジェクトを同時に対応させながら回して表を出力するということがどうしてもできませんでした。

そもそも,1つのクエリからオブジェクトが2つ出る状況というのがありえるのかも分かっていないため,アドバイスを頂ければと思っています。

該当のソースコード

【myController.php】(コントローラ)

php

1public function search(Request $request) { 2 $query = $request->input('search'); // 受け取った商品名 3 4 $item = new item; 5 // 商品名に対応する支店名 6 $branches = item::where('name', $query)->first()->branches; 7 // 商品名に対応する店名 8 //(リレーションで簡単に書けそうですが,上手く書けなかったのでjoinを使ってます) 9 $shops = item::where('items.name', $query) 10 ->select('items.id as iid', 'items.id as sid') 11 ->join('branch_item', function ($join) { 12 $join->on('items.id','=','branch_item.item_id'); // 商品名と中間テーブルの結合 13 }) 14 ->select('branches.id as bid', 'branches.name as bname') 15 ->join('branches', function ($join) { 16 $join->on('branch_item.branch_id','=','branches.id'); // 中間テーブルと支店名との結合 17 }) 18 ->select('shops.id as sid', 'shops.name as sname') 19 ->join('shops', function ($join) { 20 $join->on('shops.id','=','branches.shop_id'); // 支店名と店名の結合 21 }) 22 ->get(); 23 return view('result', ['branches' => $branches, 'shops' => $shops]); 24}

【result.blade.php】(ビュー, 検索結果)

php

1<table> 2 <thead><th>shop</th><th>branch</th></thead> 3 4 <tbody> 5 @foreach ($branches as $branch)<!-- 店名も回したい --> 6 <tr> 7 <td>{{ ↓に対応する店名を入れたい }}</td> 8 <td>{{ $branch->name }}</td> 9 </tr> 10 @endforeach 11 </tbody> 12</table>

試したこと

配列に変換してarray_map()を利用し,再びオブジェクトに変換するなども試みましたが,

<?php echo e((object)$shop->sname); ?> >>Trying to get property of non-object

のようなエラーが出てしまいました。

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

OS:Windows10
Apache 2.4.38
PHP Version 7.1.26
Laravel Framework 5.8.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

商品→支店名→店名と対応するものをすべて辿って一覧表示

リレーション定義ができていれば

$items = Item::with('branches.shop')

のような遅延ロードメソッドで関連するbranchesとshopsを持ったitemのコレクションが取得できるはずです。

(リレーションで簡単に書けそうですが,上手く書けなかったのでjoinを使ってます)

とありますがまずはモデルのリレーション定義を見直した方がいいと思います。
モデルの頭を大文字にする規約も守れていないようなので気になります。

ドキュメント

投稿2019/03/18 04:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

riz

2019/03/18 09:02

本質的な回答ありがとうございます!こんな便利なメソッドがあったのですね。 アロー演算子だけでどうにかしようとしていた私の勉強不足でした。 コードも綺麗になりテーブルも無事出力することができました。 命名規則についても見直して,テーブル・モデル・リレーション関数を綺麗に区別できるようになりました。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2019/03/18 09:06

良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問