Как создать страницу результатов поиска с несколькими запросами - PullRequest
0 голосов
/ 05 октября 2018

У меня есть таблица «Свойства», и я храню там цену, город, ванные комнаты, спальни и пригород.

Итак, я знаю, что хочу выполнить поиск по этим полям.

ЕслиЯ ищу только по пригороду, это работает, если я ищу по типу свойства, это также работает, но при попытке выбрать min_price или / и max_price, ванные комнаты и спальни, я не получаю желаемый результат.

Мой контроллервыглядит следующим образом:

public function search_page(Request $request)
{
    // validation ...
    $query = Property::query();

    if ($city = $request->input('city') ?? '')
    {
        $query->where('city', $city)
    ->orWhere('suburb', $city);
    }

    if ($type = $request->input('type') ?? '')
    {
        $query->where('type', $type);
    }

    // if none of them is null
    if (! (is_null($request->input('min_price')) && is_null($request->input('max_price')))) {
        // fetch all between min & max values
        $query->whereBetween('price', [$request->input('min_price'), $request->input('max_price')]);
    }
    // if just min_price is available (is not null)
    elseif (! is_null($request->input('min_price'))) {
        // fetch all greater than or equal to min_price
        $query->where('price', '>=', $request->input('min_price'));
    }
    // if just max_value is available (is not null)
    elseif (! is_null($request->input('max_price'))) {
        // fetch all lesser than or equal to max_value
        $query->where('price', '<=', $request->input('max_price'));
    }

    $properties = $query->orderBy('id', 'asc')->paginate(9);

    return view('pages.search', compact('properties'));     
}

И ниже находятся поисковые запросы:

{!! Form::open(['method' => 'GET', 'action'=>'AdminPropertyController@search_page']) !!}
    <div class="row flex wrap">

        <div class="col-sm-10">
            <div class="search-input">
                {!! Form::text('city', null, ['class'=>'form-controla', 'placeholder'=>'Search for area,city, or suburb']) !!}          
            </div>

            <div class="select-boxes">
                {!! Form::select('type', [''=>'Type of property'] + ['apartment'=>'Apartment', 'house'=>'House', 'plot'=>'Plot', 'smallholding'=>'Smallholding', 'commercial'=>'Commercial', 'townhouse'=>'Townhouse'], null, ['class'=>'form-']) !!}               
                {!! Form::select('min_price', [''=>'Minimum'] + [1=>'1', 20=>'20'], null, ['class'=>'form-']) !!}                       
                {!! Form::select('maxprice', [''=>'Maximum'] + [1=>'1', 20=>'20'], null, ['class'=>'form-']) !!}
                {!! Form::select('bedrooms', [''=>'Bedroom'] + [2=>'1+', 3=>'2+'], null, ['class'=>'form-']) !!}
                {!! Form::select('bathrooms', [''=>'bathroom'] + [2=>'1+', 3=>'2+'], null, ['class'=>'form-']) !!}
            </div>                                              
        </div>

        <div class="col-sm-2">
            {!! Form::submit('Search', ['class'=>'search bg-brown']) !!}
            <button class="clear-filter button">Clear Filter</button>
        </div>                  
    </div>

{!! Form::close() !!}

Как мне сделать, чтобы мой поиск работал правильно?

1 Ответ

0 голосов
/ 05 октября 2018

Я считаю, что проблема здесь:

// if none of them is null
if (! (is_null($request->input('min_price')) && is_null($request->input('max_price')))) {
    // fetch all between min & max values
    $query->whereBetween('price', [$request->input('min_price'), $request->input('max_price')]);
}
// if just min_price is available (is not null)
elseif (! is_null($request->input('min_price'))) {
    // fetch all greater than or equal to min_price
    $query->where('price', '>=', $request->input('min_price'));
}
// if just max_value is available (is not null)
elseif (! is_null($request->input('max_price'))) {
    // fetch all lesser than or equal to max_value
    $query->where('price', '<=', $request->input('max_price'));
}

В начале вы используете условие:

if (! (is_null($request->input('min_price')) && is_null($request->input('max_price')))) {

Так что, когда в запросе есть min_price, но нет max_price, это будетбыть правдой, потому что: !(false && true) дает !false и true.Вероятно, это причина, по которой вы получаете неожиданный результат.

Вместо приведенной выше строки лучше использовать:

if (!is_null($request->input('min_price')) && !is_null($request->input('max_price'))) {

Теперь, когда в запросе есть min_price, но нет max_price, выбудет иметь (!false && !true), что дает (true && false), и это дает false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...