从搜索表单中搜索一个参数,可以带多个参数Laravel
问题描述:
我创建了一个搜索表单,可以有3个参数来搜索数据库并返回结果。表单中的所有参数或表单字段都是下拉菜单。从搜索表单中搜索一个参数,可以带多个参数Laravel
表单代码:
{!!Form::open(['route' => 'search','class' => 'form-inline pull-left', 'id' => 'search-form', 'method' => 'GET', 'role' => 'search'])!!}
<select class=" form-control" name="country">
<option> Select Country</option>
@foreach($countries as $country)
<option value="{{$country->name}}">{{ucfirst($country->name)}}</option>
@endforeach
</select>
<select class=" form-control" name="category">
<option value="">Select Activity</option>
@foreach($categories as $category)
<option value="{{$category->name}}">{{ucfirst($category->name)}}</option>
@endforeach
</select>
<select class=" form-control" name="days">
<option value="">Select Duration (Days)</option>
<option value="1|5">1-5</option>
<option value="10|15">10-15</option>
<option value="20|30">20-30</option>
<option value="30|60">30-Above</option>
</select>
{{ Form::submit('Search', ['class' => 'btn btn-primary btn-lg','id' => 'search'])}}
{!! Form::close() !!}
我在控制器的方法只有一个参数来搜索:
public function search(Request $request)
{
$days = $request->days;
$days_explode = explode('|', $days);
if (isset($request->country) && !isset($request->category) && !isset($request->days)) {
$query= Tour::whereHas('country', function($r) use($request) {
$r->where('name','=', $request->country);
})
->paginate(8);
return view('public.tour.list')->withResults($query);
}
else{
$query= Tour::whereHas('country', function($r) use($request) {
$r->where('countries.name','=', $request->country);
})
->whereHas('category', function($s) use($request) {
$s->where('categories.name','=', $request->category);
})
->whereHas('country', function($r) use($request) {
$r->where('countries.name','=', $request->country);
})
->whereBetween('days', [$days_explode[0], $days_explode[1]])
->paginate(8);
return view('public.tour.list')->withResults($query);
}
我试图让我的形式灵活。它应该返回1,2或3参数是否传递给它的结果。使用上面的代码,如果所有3个参数都传递给它,表单将返回结果。如果只有一个参数传递给它,则会给出错误Undefined offset: 1
。
答
您可以先检查每个参数,然后决定是否将其添加到查询中。做这样的事情:
$query = Tour::where(function($q) use($request) {
if (!empty($request->country)) {
$q->whereHas('country', function($r) use($request) {
$r->where('countries.name', $request->country);
});
}
if (!empty($request->category)) {
$q->whereHas('category', function($r) use($request) {
$r->where('categories.name', $request->category);
});
}
})
->whereBetween('days', [$days_explode[0], $days_explode[1]])
->paginate(8);
或者你可以这样做:
$query = Tour::query();
if (!empty($request->country)) {
$query = $query->whereHas('country', function($r) use($request) {
$r->where('countries.name', $request->country);
});
}
if (!empty($request->category)) {
$query = $query->whereHas('category', function($s) use($request) {
$s->where('categories.name', $request->category);
});
}
$query = $query->whereBetween('days', [$days_explode[0], $days_explode[1]])
->paginate(8);
在你编写上面的代码。参数[days]必须在表单右侧选择? –
我想我应该去依赖下拉列表:D –
@ZacharyDale如果你想使这个或任何其他参数可选,也把它放入'if'子句中。 –