Я хочу искать без учета регистра в модели Eloquent.
Теперь я использую это
Model::where($column, 'LIKE', '%' . $value . '%' );
Но это чувствительно к регистру. Как я могу это решить?
Я также нашел этот пост Как выполнить поиск (без учета регистра) в столбце с помощью подстановочного знака LIKE?, но я не могу использовать его в модели Eloquent






Какая у вас сортировка таблиц?
Это особенность сортировки в вашей базе данных, попробуйте использовать latin_general_ci или latin_gerneral_cs, они нечувствительны к регистру.
Но если вы пытаетесь получить это в utf8_bin в качестве примера, он не будет работать, потому что это сопоставление чувствительно.
Все примеры работают под MySql.
Итак, я считаю, что этот поиск будет невозможен, ограничение будет в выборе параметров сортировки таблицы, любое переключение кода повлияет на эту особенность. Я еще не пробовал, но вы можете создать другое соединение с базой данных и в PHP-файле конфигурации базы данных и установить в этом массиве 'collation' => 'utf8_general_ci'.
Спасибо тебе за это. Я не знал, что если моя таблица - utf8_unicode_ci, «ci» означает, что она нечувствительна к регистру, поэтому мне не нужно использовать здесь ilike или другие подходы. dba.stackexchange.com/a/8031/18098
В этом случае я предлагаю верхнюю функцию
Model::whereRaw("UPPER('{$column}') LIKE '%'". strtoupper($value)."'%'");
как это
Я думаю, у вас есть лишний точка и лишние одинарные кавычки, т.е. это должно быть Model :: whereRaw ("UPPER ('$ column') LIKE '%". Strtoupper ($ value). "%'");
это кажется небезопасным
@ id614515 может кто-нибудь уточнить, почему это небезопасно и как улучшить?
@ Origami1024 Это НЕ безопасно, потому что подвержено SQL-инъекциям. Вы должны использовать привязку параметров следующим образом: Model::whereRaw('UPPER('{$column}') LIKE ?', ['%' . strtoupper($value) . '%']);
На это был дан ответ, используя оператор iLike, он нечувствителен к регистру см.
Laravel Eloquent игнорирует регистр
Или ради интереса делать это не рекомендуется ..
// prepare two variants of the same value ?
// first to uppercase
// second to lowercase
$valueUp = strtoupper($value);
$valueLower = strtolower($value);
Model::where($column, 'LIKE', '%' . ($valueUp || $valueLower) . '%' );
Не тестировал но вот идея выиграть ..
Это не сработает. Если запись БД состоит из верхних и нижних букв
Тогда этот проект базы данных будет плохо спроектированной базой данных, подготовьте контент перед вставкой в базу данных, в программировании нет ничего автоматического. перед вставкой этой конкретной записи подготовьте ее для запроса]
У вас есть пользователь с именем "John" в вашей базе данных. И вы хотите получить эту запись, когда пользователь будет искать, например, «jo». Как вы будете проектировать БД в этой ситуации?
($ valueUp || $ valueLower) => верно .. так что ваш запрос будет: 'LIKE', '% true%') ....
Так? Как ты делаешь это?
если это верблюжий случай тогда ??
@PeaceNgara, хранящая строки, которые не являются полностью прописными или полностью строчными, определенно не является плохо спроектированной базой данных ... это довольно нелепое обобщение. Как вы думаете, как хранятся описания продуктов Amazon или сообщения в блогах Medium? Как вы думаете, StackOverflow преобразует этот комментарий в нижний или верхний регистр при его сохранении, а затем снова добавляет регистр на основе знаков препинания при отображении комментария на странице? ЭТО НЕ ТО, КАК ИХ ДАННЫЕ РАБОТАЮТ. На самом деле, на мой взгляд, это было бы более показательно для плохо спроектированной базы данных.
На самом деле, вам не нужно использовать UPPER, просто используйте ilike в качестве компаратора, и он выполнит сравнение без учета регистра.
Model::where('column', 'ilike', '%' . $value . '%')
Вам делать нужны знаки % для обозначения подстроки, которую вы ищете.
Это НЕ работает в MySQL, так как не поддерживает ILIKE.
Работал на моем сервере PostgreSQL.
Это работает ТОЛЬКО для PostgreSQL, но не работает для MySQL.
Красноречивый поиск Laravel нечувствителен к регистру, вам не нужны функции ilike, upper или lower в вашем запросе.
Просто используйте:
Controller::query()
->where('column1_name', 'LIKE', "%{$search}%")
->orWhere('column2_name', 'LIKE', "%{$search}%")
->orWhere('column3_name', 'LIKE', "%{$search}%")
->get();
Часть orWhere используется в случае, если у вас есть более одного поля таблицы, которое вы хотите запросить.
Что ж, это то, что я использую сейчас. И он отлично работает
Оператор Like в некоторых случаях чувствителен к регистру, а в других - нет, в соответствии с параметрами сортировки db, см. dev.mysql.com/doc/refman/5.7/en/…
Я не знаю, как показать вам скриншот того, над чем я работаю. Я имею в виду, я также удивлен, что это работает в Laravel без сравнения кейсов. Надеюсь, вы понимаете, что я пытаюсь сказать.
Это должно сработать.
Замените column и $text.
$model = Models::whereRaw( 'LOWER(`column`) LIKE ?', [ $text ] )->first();
Не видел этого решения. так что я публикую это здесь.
DB::table('products')
->select('productid')
->where(DB::raw('lower(product)'), 'like', '%' . strtolower($searchword) . '%')
->get();
Это очень хорошо работает. Отлично!
Вам не обязательно преобразовывать ключевое слово и значение DB в один и тот же регистр (UPPER или LOWER). Вместо этого вы можете просто указать «iLIKE» вместо «LIKE». Следующий пример возвращает список данных модели на основе category_id и, что важно, от того, соответствует ли ключевое слово имени или фамилии:
$transactions = Transaction::where('category_id', $category_id);
$transactions = $transactions->where(function ($q) use($keyword) {
$q->where('firstName', 'iLIKE', '%'.$keyword.'%');
$q->orwhere('lastName', 'LIKE', '%'.$keyword.'%');
});
Я использую
utf8_bin, но не буду его менять