前回の質問で解決しなかったため、再度ご質問をお願いできれば幸いです。
以下リンクSUUMOのような構造を作る際に最もシンプルで早い方法が知りたい
SUUMO
必要な要件としては
・ 3つのテーブルをJOIN
・ それぞれのテーブルをor検索
・ ページネーション(検索条件を引き継ぎ)
テーブルの内訳としては
・物件を扱う places
・部屋を扱う place_areas
・部屋の写真を扱う 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がどのようにあのようなデータを表示しているのか想像できないので、この要件をクリアできる方法がわかる方がいらっしゃいましたら、教えていただければ幸いです。
回答1件
あなたの回答
tips
プレビュー