2017-08-07 54 views
0

这是我无法找到文档的东西。我需要为我的页面进行多个AJAX搜索。他们都来自同一个数据库。搜索的唯一区别是他们可能只需要搜索并只搜索一列。Laravel命名'Where'和AJAX语句

例如:我的页面包含一个搜索整个数据库的输入,一个允许我按国家过滤的选择和另一个允许按类型过滤的过滤器。

我遇到的问题是我无法使用,例如使select只搜索country列。它搜索整个数据库,而我需要它只搜索一列。

问题来了,我对所有东西都使用了一个控制器 - 当您只需要搜索整个数据库时,这种控制器就可以工作。说到只搜索指定的列,它不起作用。这是有问题的控制器:

$launchsitesatellite = DB::table('satellites') 
    ->where(function($q) use ($request) { 
     $q->orWhere('satname','LIKE','%'.$request->search.'%') 
      ->orWhere('norad_cat_id','LIKE','%'.$request->search.'%') 
      ->orWhere('country','LIKE','%'.$request->search.'%') 
      ->orWhere('object_id','LIKE','%'.$request->search.'%'); 
     }) 
->where('site', $site_code)->get(); 

此控制器允许轻松搜索我的数据库。我现在将显示我的AJAX请求:

$("#filter-country").change(function() { 
    $value=$(this).val(); 
    $.ajax({ 
     type: "get", 
     url: "{{$launchsitename->site_code}}", 
     data: {'search':$value, type:'country'}, 
     success: function(data){ 
      $('#launchsatdisplay').html(data); 
     } 
    }); 
}); 

这会得到用户提供的搜索请求。这一次,再次完美运作,并设法得到我想要的结果。唯一的是它搜索我的整个数据库,而我只想搜索我的数据库中的country列。

基本上,我的问题是:我是否能够命名AJAX请求,例如country,问我的控制器只使用->orWhere('country')搜索请求,所以它只能在我的数据库使用country列?有可能以某种方式命名它们吗?

+0

你的意思是' - > orWhere($请求 - >类型, '喜欢',“% ”。$请求 - >搜索。 '%'):'? –

+0

@OmisakinOluwatobi - 不幸的是,这是行不通的。每当我搜索我得到一个500服务器错误。我想这是因为它向搜索URL添加了一个'&type = country'。 –

+0

这意味着您必须确保“类型”中的文本与数据库表中的列相同 –

回答

1

由于您使用type指定搜索的类型,你可以用你的子查询中:

$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)) { // If the type is specified, use it 
       $q->orWhere($request->type,'LIKE','%'.$request->search.'%'); 

      } 
      if(!empty($request->rocket_type)) { // If the rocket_type is specified, use it 
       $q->orWhere('rocket_type','LIKE','%'.$request->rocket_type.'%'); 

      } 
     } 

    }) 
    ->where('site', $site_code)->get(); 
+0

谢谢! - 完美的作品!有一件事 - 如果我想添加另一个搜索,那么过程是什么,例如,只对列“rocket_type”进行过滤。我会添加另一个“orWhere”查询吗?还是我会做其他的事情? –

+0

您只需将其添加到其他数据库搜索。 'if'块会照顾你通过的任何类型。 – aynber

+0

我刚刚尝试在'else'语句中添加' - >或者WWE($ request-> rocket_type,'LIKE','%'。$ request-> search。'%');'但没有产生任何结果。我用'type'替换了'rocket_type'。你能确认我是否正确地做到了这一点? –