Laravel — AJAX Search позволяет применять несколько фильтров

У меня есть контроллер, который работает с вызовом 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);
}
});
});

0

Решение

Я думаю, что причина этой проблемы в том, что вы используете 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 . '%');
});

Очевидно, что вам не обязательно делать это (я просто подумал, что упомяну это).

Надеюсь это поможет!

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector