首页 文章

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

提问于
浏览
0

当我需要搜索/过滤数据库时,我有一个控制器可以处理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 回答

  • 1

    我认为你're having this issue is because you'使用 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 . '%');
        });
    

    显然,你不必这样做(我以为我会提到它) .

    希望这可以帮助!

相关问题