MySQL имеет малоизвестную функцию под названием MATCH (column1,column2) AGAINST ('keyword1 keyword2' IN BOOLEAN MODE)
, предназначенную для полнотекстового поиска. Это похоже на поиск в Google, где ключевые слова сопоставляются со значениями столбцов, где наилучшее совпадение - это лучший результат.
Помните, что сначала вам нужно очистить поисковый запрос. Определенные символы являются «нет-нет» в МАТЧЕ ПРОТИВ. Я написал эту функцию, чтобы очистить ее и подготовить поисковый запрос:
function returnMatchQuery($keyword)
{
$keyword = trim(str_replace(['+', '-', '~', '>', '<', '(', ')', '*', '´', '`'], ' ', $keyword));
$keywords = collect(explode(' ', $keyword));
$keywords = $keywords->map(function ($val)
{
return '+' . $val;
});
return implode(' ', $keywords->toArray());
}
В вашей основной функции:
$search_query = returnMatchQuery($keywords);
DB::table('users')->selectRaw("name,email,designation,city")
->whereRaw("MATCH (name,email,designation,city) AGAINST ('{$search_query}' IN BOOLEAN MODE)")
->->paginate($perPage);
Обратите внимание, что ->latest('users.created_at')
выпущен. Вы можете или не можете добавить его. Результаты могут иметь более 1 записи. Первая запись - лучший матч.
Для получения дополнительной информации проверьте эту страницу MySQL