Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用一个或多个搜索词构建自动完成服务_Php_Laravel_Autocomplete - Fatal编程技术网

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-&

我正在为我的移动应用程序构建一个自动完成功能。结果需要来自我在Laravel 5.8上构建的web服务

api.php:

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.'%']);