Laravel 5 Полнотекстовый поиск - PullRequest
0 голосов
/ 17 октября 2018

У меня есть таблица БД с полями first_name и last_name.Мне нужно проверить, является ли имя держателя кредитной карты, данное Asiapay, частью моей поездки (записи в моей таблице БД).Проблема заключается в том, что держателю кредитной карты присвоено полное имя (одно поле)

Пока мои варианты:

Мне нужны некоторые предложения для других библиотек и стратегий, касающихся сравнения строк

PS: я просто не могу сравнивать составные имена name_name и last_name и holder_name, поскольку тамслучаи, когда имена в проездных документах отличаются от имен в кредитной карте человека (например, «Джон Фу Доу» в паспорте против «Джон Доу» в кредитной карте)

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Вы можете использовать метод whereRaw в eloquent, а затем использовать функцию MYSQL Concat

    User::whereRaw("Concat(first_name,' ',last_name) LIKE '%{$search}%' ");

Здесь first_name и last_name являются именами столбцов в пользовательской таблице

0 голосов
/ 22 февраля 2019

Вот как вы должны реализовать ПОЛНЫЙ ТЕКСТОВЫЙ поиск

Сначала создайте полнотекстовый поиск на вашей таблице.

// 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;
}
0 голосов
/ 17 октября 2018

Вы можете взорвать строку на пробел:

$name = explode(' ', $name);

Затем получить имя:

$first = array_shift($name); 

Затем получить фамилию:

$last = array_pop($name);

Тогда все остальное должно быть довольно тривиальным.Удачи!

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