2017-08-09 39 views
0

我有一個控制器上的AJAX jQuery的電話,當我需要搜索的工作原理/過濾數據庫:Laravel - AJAX搜索允許應用多個過濾器

$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); 
    } 
}); 
}); 
+0

您是否考慮過使用Laravel Scout使用搜索引擎:https://laravel.com/docs/5.4/scout? –

+0

您使用的是什麼版本的Laravel? –

+0

@RossWilson我正在使用5.4 –

回答

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查詢生成器帶有一個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 . '%'); 
    }); 

很顯然,你沒有做到這一點,但(我只是想我會提到它)。

希望這會有所幫助!

+0

剛剛嘗試過,但不幸的是當我選擇第二個過濾器時,它重置了第一個過濾器。我猜'where()'不能解決問題。順便說一句,謝謝你告訴我有關'when()'方法。從來不知道它存在! –

+0

@ D.777KLM您如何選擇/提交過濾器?你只是使用鏈接或JavaScript也參與?如果是javascript,你會介意編輯你的問題來顯示你的js代碼嗎? –

+0

我使用'select'來選擇我想要過濾的術語。我在我的問題中發佈了Javascript AJAX調用。 –