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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

2506閲覧

Laravel 親テーブルと子テーブルの情報を一括で取得して表示させる方法

hina0823

総合スコア15

Laravel

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/10/19 05:24

前提・実現したいこと

タイトルの通りLaravelで親テーブルと子テーブルを一括で取得して表示させようとしています。
実際に実現したい画面としては下記になります

メインカテゴリー1  サブカテゴリー1  サブカテゴリー2  サブカテゴリー3 メインカテゴリー2  サブカテゴリー4  サブカテゴリー5  サブカテゴリー6 メインカテゴリー3  サブカテゴリー7  サブカテゴリー8  サブカテゴリー9

課題としては表示はできているのですが、カテゴリー分クエリが発行されてしまい、N+1問題を引き起こしています。

データベース

post_main_categoriesテーブル

+---------------+--------------+------+-----+---------------------+-------------------------------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+---------------------+-------------------------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | main_category | varchar(255) | NO | UNI | NULL | | +---------------+--------------+------+-----+---------------------+-------------------------------+

post_sub_categoriesテーブル

+-----------------------+--------------+------+-----+---------------------+-------------------------------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+--------------+------+-----+---------------------+-------------------------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | post_main_category_id | int(11) | NO | MUL | NULL | | | sub_category | varchar(255) | NO | UNI | NULL | | +-----------------------+--------------+------+-----+---------------------+-------------------------------+

該当ソースコード

PostMainCategory.php

php

1public function postSubCategories() 2{ 3 return $this->hasMany('App\Models\Posts\PostSubCategory'); 4}

PostController.php

php

1public function postCategoryIndex() 2{ 3 return view('post_category.index', [ 4 'post_main_categories' => PostMainCategory::with('postSubCategories')->get(), 5 ]); 6}

index.blade.php

php

1<ul> 2 @foreach ($post_main_categories as $post_main_category) 3 <li>{{ $post_main_category->main_category }} 4 <ul> 5 @foreach ($post_main_category->PostSubCategories as $post_sub_category) 6 <li>{{ $post_sub_category->sub_category }}</li> 7 @endforeach 8 </ul> 9 </li> 10 @endforeach 11</ul>

バージョン

PHP 7.3.31
Laravel 6.20.35

N+1を解消するいい方法があればご教授いただければと思います。
また、そもそものデーベースの設計がおかしいなどもあればご教授ください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

hasMany のばあい、with や load 使ってもループの中で SQL 発行するのはやぬを得ないので、Laravel らしく書くには、このようにするぐらいしか方法ないかも。

public function postCategoryIndex() { /** @var Collection $postMainCategories */ $postMainCategories = PostMainCategory::all(); /** @var Collection $postSubCategories */ $postSubCategories = PostSubCategory::query() ->whereIn('post_main_category_id', $postMainCategories->pluck('id')->toArray()) ->get(); $postMainCategories = $postMainCategories->map(function (PostMainCategory $postMainCategory) use ($postSubCategories) { $subs = $postSubCategories->where('post_main_category_id', $postMainCategory->id); $postMainCategory->setAttribute('postSubCategories', $subs); return $postMainCategory; }); return view('post_category.index', [ 'post_main_categories' => $postMainCategories, ]); }

投稿2021/10/19 08:29

phper.k

総合スコア3923

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

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

hina0823

2021/10/21 10:57

ありがとうございます!! こちらのやり方で解決できました!
guest

0

N+1で検索したらこのページが出てきましたが、includesメソッドを使ってin演算子でSQL構築すれば問題なさそうです。

N+1問題

投稿2021/10/19 06:23

FKM

総合スコア3608

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問