Laravel raw query: Удаление символов из строки | как это может быть улучшено?

Я использую глобальную панель поиска, которая принимает пользовательский ввод в виде строк. Тем не менее, я хочу излучать специальные печатные символы. Подумайте о точках, запятых, 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 ответ

Решение

Вы можете упростить создание запроса:

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

Если вы выполняете большой поиск, вам, возможно, следует создать отдельный столбец, в котором имя хранится без специальных символов.

Другие вопросы по тегам