如何使用多个查询创建搜索结果页面

时间:2018-10-05 12:15:25

标签: eloquent laravel-5.6

我有一个名为Properties的表,在其中存储了价格,城市,浴室,卧室和郊区。

所以我知道我想基于这些字段进行搜索。

如果仅按郊区搜索,它可以工作,如果搜索属性类型,它也可以工作,但是当尝试选择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 :(得分:0)

我相信问题就在这里

// 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的事物。