Я создаю функцию автозаполнения для своего мобильного приложения.Результаты должны поступить из моего веб-сервиса, построенного на Laravel 5.8.
api.php:
Route::get('locations/autocomplete', 'LocationsController@autocomplete');
LocationsController:
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);
}
Когда я делаю запрос GETна localhost:8000/api/locations/autocomplete?words[]=united&words[]=atlanta
, это дает мне результат, как если бы я написал его, используя $locations->orWhereRaw
:
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%
То, что я хочу, - это логически разделить два блока с помощью 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%)