Laravel - AJAX搜索允许应用多个过滤器

时间:2017-08-09 20:40:10

标签: php jquery ajax laravel

当我需要搜索/过滤数据库时,我有一个用于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调用

$("#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);
    }
});
});

1 个答案:

答案 0 :(得分:1)

我认为您遇到此问题的原因是因为您使用的是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 . '%');
    });

显然,你不必这样做(我以为我只是提到它)。

希望这有帮助!

相关问题