Вот как вы должны реализовать ПОЛНЫЙ ТЕКСТОВЫЙ поиск
Сначала создайте полнотекстовый поиск на вашей таблице.
// Full Text Index
DB::statement('ALTER TABLE contacts ADD FULLTEXT fulltext_index (firstName, lastName, email)');
Затем в вашей модели
$columns = 'firstName,lastName,email';
$contacts = Contact::where('customer_id', $request->user()->customer_id)
->select(['id', 'firstName', 'lastName', 'email', 'phone', 'mobile', 'lastContacted', 'assignedTo', 'createdBy'])
->whereRaw("MATCH ({$columns}) AGAINST (? IN BOOLEAN MODE)", $this->fullTextWildcards($q))
->paginate(10);
Вот функция fullTextWildcards
, которая заменяет пробелы подстановочными знаками полнотекстового поиска.
protected function fullTextWildcards($term)
{
// removing symbols used by MySQL
$reservedSymbols = ['-', '+', '<', '>', '@', '(', ')', '~'];
$term = str_replace($reservedSymbols, '', $term);
$words = explode(' ', $term);
foreach ($words as $key => $word) {
/*
* applying + operator (required word) only big words
* because smaller ones are not indexed by mysql
*/
if (strlen($word) >= 3) {
$words[$key] = '*' . $word . '*';
}
}
$searchTerm = implode(' ', $words);
return $searchTerm;
}