Laravel原始查询:从字符串中删除字符|怎么改进?

时间:2018-04-12 09:16:21

标签: mysql laravel query-builder

我正在使用全局搜索栏,将用户输入视为字符串。但是,我想发出特殊的输入字符。想想点,逗号,ETC.您可以在下面看到我当前的数据库检查(因为它是基于Ajax的):

public function scopeWhereName($query, $queryString) {
    $query->where(function ($query) use ($queryString) {
        $query->where(\DB::raw("REPLACE(name, ' ', '')"), 'LIKE', '%' . $queryString . '%')
        ->orWhere(\DB::raw("REPLACE(name, '.', '')"), 'LIKE', '%' . $queryString . '%')
        ->orWhere(\DB::raw("REPLACE(name, ',', '')"), 'LIKE', '%' . $queryString . '%')
        ->orWhere(\DB::raw("REPLACE(name, '!', '')"), 'LIKE', '%' . $queryString . '%')
        ->orWhere(\DB::raw("REPLACE(name, '?', '')"), 'LIKE', '%' . $queryString . '%')
        ->orWhere(\DB::raw("REPLACE(name, ':', '')"), 'LIKE', '%' . $queryString . '%')
        ->orWhere(\DB::raw("REPLACE(name, '-', '')"), 'LIKE', '%' . $queryString . '%')
        ->orWhere(\DB::raw("REPLACE(name, '@', '')"), 'LIKE', '%' . $queryString . '%')
        ->orWhere(\DB::raw("REPLACE(name, '#', '')"), 'LIKE', '%' . $queryString . '%')
        ->orWhere(\DB::raw("REPLACE(name, '&', '')"), 'LIKE', '%' . $queryString . '%')
        ->orWhere(\DB::raw("REPLACE(name, '/', '')"), 'LIKE', '%' . $queryString . '%');
    });
}

我的问题,正如标题中所述,如果上述查询有可能成为更好的查询,那么它的性能会更轻松,更容易阅读。

1 个答案:

答案 0 :(得分:1)

您可以简化查询创建:

$chars = [' ', '.', ',', ...];
foreach($chars as $char) {
    $query->orWhere(\DB::raw("REPLACE(name, '$char', '')"), 'LIKE', '%' . $queryString . '%')
}

如果你进行了大量的搜索,你应该创建一个单独的列来存储没有特殊字符的名称。