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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel 5

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

Q&A

解決済

1回答

1361閲覧

3つのテーブルJOINして、検索・ページネーションをLaravelで実現するSQLを教えてください。

alberorana

総合スコア52

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel 5

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

0グッド

0クリップ

投稿2019/03/31 09:46

前回の質問で解決しなかったため、再度ご質問をお願いできれば幸いです。

前回の質問

以下リンクSUUMOのような構造を作る際に最もシンプルで早い方法が知りたい
SUUMO

必要な要件としては
・ 3つのテーブルをJOIN
・ それぞれのテーブルをor検索
・ ページネーション(検索条件を引き継ぎ)

テーブルの内訳としては
・物件を扱う places
・部屋を扱う place_areas
・部屋の写真を扱う place_area_images
になります。

places
places

place_areas
place_areas

place_area_images
place_area_images

検索の要件としては
・物件名( places.name)
・物件住所( places.city)
・部屋名( place_areas.name)
をor検索なので、物件名がヒットしなくても部屋名がヒットすればそのレコードは取得できるという事です。

このような画面は物件に紐づく部屋をJOINでひろってきて、Viewでこのように表示するとスムーズかと考えていますが、Viewに渡すまでのコントローラー・モデルをどうもスッキリシンプルに書くことができません。
View

controller

1public function placeView(Request $request) 2 { 3 //POSTとGETの分岐 4 if($post=$request->all()) 5 { 6 $this->place = Place::query(); 7 } 8 else{ 9 //GETだったらViewでundefindindex回避のためnull代入 10 $post=null; 11 } 12 // もし住所検索があれば 13 if(!empty($post['p']['address'])){ 14 $this->place->orWhere('state','like','%'.$post['p']['address'].'%')->orWhere('city','like','%'.$post['p']['address'].'%')->orWhere('street','like','%'.$post['p']['address'].'%'); 15 } 16 //もし物件名があれば 17 if(!empty($post['p']['name'])){ 18 $this->place->orWhere('name','like','%'.$post['p']['name'].'%'); 19 } 20 21 //placesテーブルからテータ取得 22 $places = $this->place->select('places.*', 'pa.name AS place_name', 'pai.photo')->orderBy('places.id','DESC') 23 ->join('place_areas as pa', 'places.id', 'pa.place_id') 24 ->leftJoin('place_area_images as pai', 'pa.id', 'pai.place_area_id')->paginate(30); 25 $place_items = $places->items();

という風に取得してしまうと、そもそも以下のような配列になってしまう、Viewでうまくループ表示できなく、かなり行き詰まっています。
SUUMOがどのようにあのようなデータを表示しているのか想像できないので、この要件をクリアできる方法がわかる方がいらっしゃいましたら、教えていただければ幸いです。

イメージ説明

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/03/31 16:09

Modelの定義を提示してください。
guest

回答1

0

ベストアンサー

JOINは結構DBに負荷をかけるので(10000件あったら10000件JOINする気がする)、写真などはhasManyのリレーションで処理するのが良いかと思います

投稿2019/04/05 02:16

mikkame

総合スコア5036

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問