前提・実現したいこと
タイトルの通り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を解消するいい方法があればご教授いただければと思います。
また、そもそものデーベースの設計がおかしいなどもあればご教授ください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/21 10:57