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

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

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

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

Q&A

解決済

1回答

983閲覧

Laravel クエリビルダを使った絞り込み

Karna

総合スコア0

Laravel

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

0グッド

0クリップ

投稿2020/12/19 09:56

前提・実現したいこと

Laravelの学習としてSuumoの物件検索みたいな絞り込みを実装しようとしています。
https://suumo.jp/chintai/tokyo/city/

発生している問題・エラーメッセージ

クエリビルダを使った絞り込みを実装しようとしていますが、1つ1つの入力の絞り込みは実装できても
2つをかけ合わせたものが実装できません。
(下のコードだと区と最低賃料・最高賃料のAND検索)

該当のソースコード

PHP

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Building; 7 8class BuildingController extends Controller 9{ 10 public function search(Request $request) 11 { 12 $search_flg = FALSE; 13 $query = null; 14 $buildings = null; 15 16 foreach (config('building') as $key => $value) { 17 if ($request->has($key)) { 18 19 // 絞り込みを行ったかどうか 20 if ($search_flg == FALSE) { 21 $search_flg = TRUE; 22 } 23 24 $query = Building::query(); 25 26 $query->when($key == 'wa', function ($query) use ($request, $key) { 27 $wa_role = $request->input($key); 28 foreach ($wa_role as $value) { 29 $query->orWhere('ward', $value); 30 } 31 })->where(function ($query) use ($request, $key) { 32 if ($request->input('mir') != 1 && $request->input('mar') != 1) { 33 $query->where('min_rent', '>=', $request->input('mir')) 34 ->where('max_rent', '=<', $request->input('mar')); 35 } else if ($request->input('mir') == 1 && $request->input('mar') != 1) { 36 $query->where('max_rent', '=<', $request->input('mar')); 37 } else if ($request->input('mir') != 1 && $request->input('mar') == 1) { 38 $query->where('min_rent', '>=', $request->input('mir')); 39 } 40 }); 41 } 42 } 43 if (!is_null($query)) { 44 $buildings = $query->get(); 45 } 46 47 return view('building/search', compact('search_flg', 'buildings')); 48 } 49}

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>Bladeによるこんにちは</title> 6</head> 7<body> 8 <form> 9 <p>ご希望の区を選択してください</p> 10 <label><input type="checkbox" name="wa[]" value="千代田区">千代田区</label> 11 <label><input type="checkbox" name="wa[]" value="中央区">中央区</label> 12 <label><input type="checkbox" name="wa[]" value="港区">港区</label> 13 <label><input type="checkbox" name="wa[]" value="新宿区">新宿区</label> 14 <label><input type="checkbox" name="wa[]" value="文京区">文京区</label> 15 <label><input type="checkbox" name="wa[]" value="台東区">台東区</label> 16 <label><input type="checkbox" name="wa[]" value="墨田区">墨田区</label> 17 <label><input type="checkbox" name="wa[]" value="江東区">江東区</label> 18 <label><input type="checkbox" name="wa[]" value="品川区">品川区</label> 19 <label><input type="checkbox" name="wa[]" value="目黒区">目黒区</label> 20 <label><input type="checkbox" name="wa[]" value="大田区">大田区</label> 21 <label><input type="checkbox" name="wa[]" value="世田谷区">世田谷区</label> 22 <label><input type="checkbox" name="wa[]" value="渋谷区">渋谷区</label> 23 <label><input type="checkbox" name="wa[]" value="中野区">中野区</label> 24 <label><input type="checkbox" name="wa[]" value="杉並区">杉並区</label> 25 <label><input type="checkbox" name="wa[]" value="豊島区">豊島区</label> 26 <label><input type="checkbox" name="wa[]" value="北区">北区</label> 27 <label><input type="checkbox" name="wa[]" value="荒川区">荒川区</label> 28 <label><input type="checkbox" name="wa[]" value="板橋区">板橋区</label> 29 <label><input type="checkbox" name="wa[]" value="練馬区">練馬区</label> 30 <label><input type="checkbox" name="wa[]" value="足立区">足立区</label> 31 <label><input type="checkbox" name="wa[]" value="葛飾区">葛飾区</label> 32 <label><input type="checkbox" name="wa[]" value="江戸川区">江戸川区</label> 33 34 <p>ご希望の条件を選択してください</p> 35 36 <dl> 37 <dt>賃料</dt> 38 <dd> 39 <select name="mir"> 40 <option value="1" selected="selected">下限なし</option> 41 <option value="100000">10万円</option> 42 <option value="150000">15万円</option> 43 <option value="200000">20万円</option> 44 <option value="250000">25万円</option> 45 <option value="300000">30万円</option> 46 <option value="400000">40万円</option> 47 <option value="500000">50万円</option> 48 <option value="700000">70万円</option> 49 <option value="1000000">100万円</option> 50 </select> 5152 <select name="mar"> 53 <option value="1" selected="selected">上限なし</option> 54 <option value="100000">10万円</option> 55 <option value="150000">15万円</option> 56 <option value="200000">20万円</option> 57 <option value="250000">25万円</option> 58 <option value="300000">30万円</option> 59 <option value="400000">40万円</option> 60 <option value="500000">50万円</option> 61 <option value="700000">70万円</option> 62 <option value="1000000">100万円</option> 63 </select> 64 </dd> 65 </dl> 66 <input type="submit" value="この条件で検索する"> 67 </form> 68 69 <p>検索結果</p> 70 @if (!is_null($buildings) && $search_flg == TRUE) 71 @for ($i = 0; $i < count($buildings); $i++) 72 <p>ID: {{ $buildings[$i]->id }}</p> 73 <p>建物名: {{ $buildings[$i]->name }}</p> 74 <p>区: {{ $buildings[$i]->ward }}</p> 75 <p>最高賃料: {{ $buildings[$i]->max_rent }}</p> 76 <p>最低賃料: {{ $buildings[$i]->min_rent }}</p> 77 @endfor 78 @endif 79 80</body> 81</html> 82

試したこと

上記のソースコードだと、区や最低賃料・最高賃料といった1つの検索条件は絞り込めるのですが、
2つのAND検索検索になると最低賃料・最高賃料の検索結果に上書きされてしまってます。

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

laravel6.20.7

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

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

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

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

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

guest

回答1

0

自己解決

foreachの条件によってqueryが実行されていないだけでした。
書き方を工夫することで改善しました。

投稿2020/12/20 08:35

Karna

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問