Laravel 5全文搜索

时间:2018-10-17 10:06:10

标签: php laravel laravel-5

我有一个具有字段first_name和last_name的数据库表。我需要检查Asiapay给出的信用卡持有人姓名是否属于我的旅行聚会的一部分(在我的数据库表中的记录)。问题是给定的信用卡持有人是全名(单个字段)

到目前为止,我的选择是:

我需要其他有关字符串比较的库和策略的建议

PS:我只是无法比较串联的名字和姓氏与持有人名称,因为在某些情况下旅行证件中的姓名与个人信用卡中的姓名不同(例如,“ John Foo Doe” 护照与信用卡中的“ John Doe”

4 个答案:

答案 0 :(得分:0)

您可能会用空格将字符串炸开:

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

然后获得名字:

$first = array_shift($name); 

然后获取姓氏:

$last = array_pop($name);

然后其余的部分就不那么重要了。祝你好运!

答案 1 :(得分:0)

这是实现全文搜索的方法

首先在您的桌子上创建全文搜索。

// 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;
}

答案 2 :(得分:0)

检查此软件包。 有很多选项可以改善全文搜索

enter image description here

答案 3 :(得分:-1)

您可以雄辩地使用whereRaw方法,然后使用MYSQL Concat函数

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

名字姓氏是用户表中的列名