Laravel 原始查询:从字符串中删除字符 |如何改进?
Laravel raw query: Removing chars from string | How can it be improved?
我正在使用接受用户输入字符串的全局搜索栏。但是,我想发出特殊的打字字符。想想点、逗号等。您可以在下面看到我当前的数据库检查(因为它是基于 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 . '%');
});
}
我的问题,如标题所述,是如果有可能将上面的查询做成更好的查询,那么性能更轻,更容易阅读。
您可以简化查询创建:
$chars = [' ', '.', ',', ...];
foreach($chars as $char) {
$query->orWhere(\DB::raw("REPLACE(name, '$char', '')"), 'LIKE', '%' . $queryString . '%')
}
如果您进行大量搜索,您或许应该创建一个单独的列来存储没有特殊字符的名称。
我正在使用接受用户输入字符串的全局搜索栏。但是,我想发出特殊的打字字符。想想点、逗号等。您可以在下面看到我当前的数据库检查(因为它是基于 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 . '%');
});
}
我的问题,如标题所述,是如果有可能将上面的查询做成更好的查询,那么性能更轻,更容易阅读。
您可以简化查询创建:
$chars = [' ', '.', ',', ...];
foreach($chars as $char) {
$query->orWhere(\DB::raw("REPLACE(name, '$char', '')"), 'LIKE', '%' . $queryString . '%')
}
如果您进行大量搜索,您或许应该创建一个单独的列来存储没有特殊字符的名称。