У меня есть контроллер, который работает с вызовом AJAX jQuery, когда мне нужно искать / фильтровать базу данных:
$launchsitesatellite = DB::table('satellites')
->where(function($q) use ($request) {
if(empty($request->type) && empty($request->rocket_type)) {
$q->orWhere('satname','LIKE','%'.$request->search.'%')
->orWhere('norad_cat_id','LIKE','%'.$request->search.'%')
->orWhere('country','LIKE','%'.$request->search.'%')
->orWhere('object_id','LIKE','%'.$request->search.'%');
} else {
if(!empty($request->type)) {
$q->orWhere($request->type,'LIKE','%'.$request->search.'%');
}
if(!empty($request->object_type)) {
$q->orWhere('object_type','LIKE','%'.$request->object_type.'%');
}
if(!empty($request->launch_year)) {
$q->orWhere('launch','LIKE','%'.$request->launch_year.'%');
}
}
})
->where('site', $site_code)->Paginate(300);
Этот контроллер может искать / фильтровать мою базу данных без проблем. Единственное, что я хотел бы исправить, это разрешить применение нескольких фильтров. Например, в настоящее время, когда я фильтрую по типу объекта, а затем решаю фильтровать по стране, он сбрасывает тип объекта.
То, что я хочу сделать, это разрешить фильтрацию по типу объекта и стране, а не только по одному.
Не хватало примеров / документации, поэтому я не смог найти примеров того, как это сделать.
РЕДАКТИРОВАТЬ: JS AJAX Call
$("#filter-type").change(function() {
$value=$(this).val();
$.ajax({
type: "get",
url: "{{$launchsitename->site_code}}",
data: {'search':$value, type:'object_type'},
success: function(data){
$('#launchsatdisplay').html(data);
}
});
});
Я думаю, что причина этой проблемы в том, что вы используете orWhere
скорее, чем where
таким образом, теоретически, чем больше фильтров вы используете, тем больше результатов вы получите (вместо того, чтобы ограничивать результаты).
$launchsitesatellite = DB::table('satellites')
->where(function ($q) use ($request) {
if (!$request->has('type') && !$request->has('rocket_type')) {
$q->orWhere('satname', 'LIKE', '%' . $request->search . '%')
->orWhere('norad_cat_id', 'LIKE', '%' . $request->search . '%')
->orWhere('country', 'LIKE', '%' . $request->search . '%')
->orWhere('object_id', 'LIKE', '%' . $request->search . '%');
} else {
if ($request->has('type')) {
$q->where($request->type, 'LIKE', '%' . $request->search . '%');
}
if ($request->has('object_type')) {
$q->where('object_type', 'LIKE', '%' . $request->object_type . '%');
}
if ($request->has('launch_year')) {
$q->where('launch', 'LIKE', '%' . $request->launch_year . '%');
}
}
})
->where('site', $site_code)
->Paginate(300);
Также, к вашему сведению, Laravel Query Builder поставляется с when()
метод, который является альтернативой использованию нескольких if
заявления. Итак, основной else
раздел будет выглядеть так:
$q
->when($request->has('type'), function ($q) use ($request) {
$q->where($request->type, 'LIKE', '%' . $request->search . '%');
})
->when($request->has('object_type'), function ($q) use ($request) {
$q->where('object_type', 'LIKE', '%' . $request->object_type . '%');
})
->when($request->has('launch_year'), function ($q) use ($request) {
$q->where('launch', 'LIKE', '%' . $request->launch_year . '%');
});
Очевидно, что вам не обязательно делать это (я просто подумал, что упомяну это).
Надеюсь это поможет!
Других решений пока нет …