laravel原始查询:从字符串中删除字符|如何改进?

okxuctiv  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(434)

我使用的是一个全局搜索栏,它接受用户输入作为字符串。但是,我想发出特殊的键入字符。请考虑点、逗号等。您可以在下面看到我当前的数据库检查(因为它是基于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 . '%');
    });
}

如标题所述,我的问题是,是否有可能将上面的查询转换成更好的查询,从而使其性能更轻、更易于阅读。

w1jd8yoj

w1jd8yoj1#

您可以简化查询创建:

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

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

相关问题