Php 使用一个或多个搜索词构建自动完成服务
我正在为我的移动应用程序构建一个自动完成功能。结果需要来自我在Laravel 5.8上构建的web服务 api.php:Php 使用一个或多个搜索词构建自动完成服务,php,laravel,autocomplete,Php,Laravel,Autocomplete,我正在为我的移动应用程序构建一个自动完成功能。结果需要来自我在Laravel 5.8上构建的web服务 api.php: Route::get('locations/autocomplete', 'LocationsController@autocomplete'); 位置控制器: public function autocomplete(Request $request) { $locations = Location::query(); foreach($request-&
Route::get('locations/autocomplete', 'LocationsController@autocomplete');
位置控制器:
public function autocomplete(Request $request)
{
$locations = Location::query();
foreach($request->words as $word) {
$locations->whereRaw('country_name LIKE ? OR state_name LIKE ? OR city_name LIKE ? ', ['%'.$word.'%','%'.$word.'%','%'.$word.'%']);
}
$locations = $locations->distinct()->paginate(10);
return AutoCompleteLocationResource::collection($locations);
}
当我对localhost:8000/api/locations/autocomplete?words[]=united&words[]=atlanta执行GET请求时,它会给出一个结果,就像我使用$locations->orWhereRaw编写它一样:
我想要的是逻辑上用AND分隔两个块,如下所示:
select * from locations where
(country_name LIKE %united% OR state_name LIKE %united% OR city_name LIKE %united%)
AND
(country_name LIKE %atlanta% OR state_name LIKE %atlanta% OR city_name LIKE %atlanta%)
显然,对whereRaw的多个调用在逻辑上并没有分隔每个查询。你必须手动操作 这就是解决问题的方法
$locations->whereRaw('(country_name LIKE ? OR state_name LIKE ? OR city_name LIKE ? )', ['%'.$word.'%','%'.$word.'%','%'.$word.'%']);
请注意whereRaw的第一个参数开头和结尾的额外和字符 试试这个:
$query=Location::query;
foreach$request->words as$word{
$query->wherefunction$qry使用$word{
$qry->where'country_name'、'like'、'%'。$word'%';
$qry->orWhere'state_name'、'like'、'%'。$word'%';
$qry->orWhere'city_name'、'like'、'%'。$word'%';
};
}
$locations=$query->distinct->paginate10;
这就是所谓的参数分组。谢谢没问题,很乐意帮忙。
$locations->whereRaw('(country_name LIKE ? OR state_name LIKE ? OR city_name LIKE ? )', ['%'.$word.'%','%'.$word.'%','%'.$word.'%']);