我有一个名为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() !!}
如何使搜索正常进行?
答案 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
的事物。