Создайте службу автозаполнения с одним или несколькими условиями поиска. - PullRequest
0 голосов
/ 08 июля 2019

Я создаю функцию автозаполнения для своего мобильного приложения.Результаты должны поступить из моего веб-сервиса, построенного на 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%)

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Попробуйте это:

$query = Location::query();

foreach($request->words as $word) {
   $query->where(function($qry) use ($word)  {
       $qry->where('country_name', 'like', '%'.$word.'%');
       $qry->orWhere('state_name', 'like', '%'.$word.'%');
       $qry->orWhere('city_name', 'like', '%'.$word.'%');
   });
}

$locations = $query->distinct()->paginate(10);
0 голосов
/ 08 июля 2019

Очевидно, что несколько вызовов whereRaw не разделяют логически каждый запрос. Вы должны сделать это вручную.

Это то, что решило проблему.

$locations->whereRaw('(country_name LIKE ? OR state_name LIKE ? OR city_name LIKE ? )', ['%'.$word.'%','%'.$word.'%','%'.$word.'%']);

Обратите внимание на дополнительные символы «(» и «)» в начале и конце первого параметра для whereRaw.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...