Как искать нечувствительность к регистру в модели Eloquent

Я хочу искать без учета регистра в модели Eloquent.

Теперь я использую это

Model::where($column, 'LIKE', '%' . $value . '%' ); 

Но это чувствительно к регистру. Как я могу это решить?

Я также нашел этот пост Как выполнить поиск (без учета регистра) в столбце с помощью подстановочного знака LIKE?, но я не могу использовать его в модели Eloquent

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
26
0
35 346
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Какая у вас сортировка таблиц?

Это особенность сортировки в вашей базе данных, попробуйте использовать latin_general_ci или latin_gerneral_cs, они нечувствительны к регистру.

Но если вы пытаетесь получить это в utf8_bin в качестве примера, он не будет работать, потому что это сопоставление чувствительно.

Все примеры работают под MySql.

Я использую utf8_bin, но не буду его менять

Davit 24.07.2018 14:01

Итак, я считаю, что этот поиск будет невозможен, ограничение будет в выборе параметров сортировки таблицы, любое переключение кода повлияет на эту особенность. Я еще не пробовал, но вы можете создать другое соединение с базой данных и в PHP-файле конфигурации базы данных и установить в этом массиве 'collation' => 'utf8_general_ci'.

guiCunha 24.07.2018 19:09

Спасибо тебе за это. Я не знал, что если моя таблица - utf8_unicode_ci, «ci» означает, что она нечувствительна к регистру, поэтому мне не нужно использовать здесь ilike или другие подходы. dba.stackexchange.com/a/8031/18098

Ryan 19.08.2019 20:46
Ответ принят как подходящий

В этом случае я предлагаю верхнюю функцию

Model::whereRaw("UPPER('{$column}') LIKE '%'". strtoupper($value)."'%'"); 

как это

Я думаю, у вас есть лишний точка и лишние одинарные кавычки, т.е. это должно быть Model :: whereRaw ("UPPER ('$ column') LIKE '%". Strtoupper ($ value). "%'");

SuperNOVA 12.12.2018 13:36

это кажется небезопасным

id614515 14.06.2019 12:42

@ id614515 может кто-нибудь уточнить, почему это небезопасно и как улучшить?

Origami1024 10.07.2020 12:19

@ Origami1024 Это НЕ безопасно, потому что подвержено SQL-инъекциям. Вы должны использовать привязку параметров следующим образом: Model::whereRaw('UPPER('{$column}') LIKE ?', ['%' . strtoupper($value) . '%']);

Michiel 07.01.2021 20:25

На это был дан ответ, используя оператор 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) . '%' ); 

Не тестировал но вот идея выиграть ..

Это не сработает. Если запись БД состоит из верхних и нижних букв

Ts8060 24.07.2018 14:08

Тогда этот проект базы данных будет плохо спроектированной базой данных, подготовьте контент перед вставкой в ​​базу данных, в программировании нет ничего автоматического. перед вставкой этой конкретной записи подготовьте ее для запроса]

Peace Ngara 24.07.2018 14:10

У вас есть пользователь с именем "John" в вашей базе данных. И вы хотите получить эту запись, когда пользователь будет искать, например, «jo». Как вы будете проектировать БД в этой ситуации?

Ts8060 24.07.2018 14:13

($ valueUp || $ valueLower) => верно .. так что ваш запрос будет: 'LIKE', '% true%') ....

Simon Fakir 24.04.2019 17:58

Так? Как ты делаешь это?

Matteo Gaggiano 22.05.2019 14:04

если это верблюжий случай тогда ??

r89human 28.11.2019 13:27

@PeaceNgara, хранящая строки, которые не являются полностью прописными или полностью строчными, определенно не является плохо спроектированной базой данных ... это довольно нелепое обобщение. Как вы думаете, как хранятся описания продуктов Amazon или сообщения в блогах Medium? Как вы думаете, StackOverflow преобразует этот комментарий в нижний или верхний регистр при его сохранении, а затем снова добавляет регистр на основе знаков препинания при отображении комментария на странице? ЭТО НЕ ТО, КАК ИХ ДАННЫЕ РАБОТАЮТ. На самом деле, на мой взгляд, это было бы более показательно для плохо спроектированной базы данных.

Air 04.07.2021 23:23

На самом деле, вам не нужно использовать UPPER, просто используйте ilike в качестве компаратора, и он выполнит сравнение без учета регистра.

Model::where('column', 'ilike', '%' . $value . '%')

Вам делать нужны знаки % для обозначения подстроки, которую вы ищете.

Это НЕ работает в MySQL, так как не поддерживает ILIKE.

Putr 04.10.2019 15:41

Работал на моем сервере PostgreSQL.

Mamun Morshed 29.04.2020 20:57

Это работает ТОЛЬКО для PostgreSQL, но не работает для MySQL.

Liga 08.05.2020 09:48

Красноречивый поиск Laravel нечувствителен к регистру, вам не нужны функции ilike, upper или lower в вашем запросе.

Просто используйте:

Controller::query()
    ->where('column1_name', 'LIKE', "%{$search}%") 
    ->orWhere('column2_name', 'LIKE', "%{$search}%") 
    ->orWhere('column3_name', 'LIKE', "%{$search}%") 
    ->get();

Часть orWhere используется в случае, если у вас есть более одного поля таблицы, которое вы хотите запросить.

Что ж, это то, что я использую сейчас. И он отлично работает

Koiki Damilare 10.08.2020 11:52

Оператор Like в некоторых случаях чувствителен к регистру, а в других - нет, в соответствии с параметрами сортировки db, см. dev.mysql.com/doc/refman/5.7/en/…

OMR 12.08.2020 20:03

Я не знаю, как показать вам скриншот того, над чем я работаю. Я имею в виду, я также удивлен, что это работает в Laravel без сравнения кейсов. Надеюсь, вы понимаете, что я пытаюсь сказать.

Koiki Damilare 12.08.2020 21:22

Это должно сработать.

Замените column и $text.

$model = Models::whereRaw( 'LOWER(`column`) LIKE ?', [ $text ] )->first();

Не видел этого решения. так что я публикую это здесь.

DB::table('products')
   ->select('productid')                
   ->where(DB::raw('lower(product)'), 'like', '%' . strtolower($searchword) . '%')
   ->get();

Это очень хорошо работает. Отлично!

dustbuster 19.02.2021 16:21

Вам не обязательно преобразовывать ключевое слово и значение 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.'%');
});

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