【问题标题】:Laravel - AJAX Search allow Multiple Filters to be appliedLaravel - AJAX 搜索允许应用多个过滤器
【发布时间】:2017-08-09 20:40:10
【问题描述】:

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

【问题讨论】:

  • 你是否考虑过使用带有 Laravel Scout 的搜索引擎:laravel.com/docs/5.4/scout
  • 你使用的是什么版本的 Laravel?
  • @RossWilson 我使用的是 5.4
  • 当前代码有什么问题?
  • @LakshayJain 我可以选择一个过滤器,但是当我选择第二个过滤器时,它会重置第一个。

标签: php jquery ajax laravel


【解决方案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 . '%');
    });

显然,您不必这样做(我只是想我会提到它)。

希望这会有所帮助!

【讨论】:

  • 刚试过,但不幸的是,当我选择第二个过滤器时,它会重置第一个。我猜where() 不能解决这个问题。顺便说一句,感谢您告诉我有关 when() 方法的信息。从来不知道它的存在!
  • @D.777KLM 您如何选择/提交过滤器?您只是使用链接还是也涉及到 javascript?如果是 javascript,您介意编辑您的问题以显示您的 js 代码吗?
  • 我使用select 来选择我想要过滤的术语。我已经在我的问题中发布了 Javascript AJAX 调用。
  • @D.777KLM 您一次只提交一个值,所以是的,它每次都会重置。
  • 所以我想这就是问题所在。然后我需要找到一种方法来保存第一个过滤器,并且在我提交第二个过滤器时不重置它,除非用户重置它。
猜你喜欢
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 2013-08-10
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多