Использование Laravel eloquent для поиска, если значение в столбце базы данных появляется в строке поиска

В настоящее время я работаю над проектом laravel 5.4, где пытаюсь найти в своей базе данных значения, похожие на введенную строку поиска. Например, у меня есть следующий поисковый запрос

$search_term = "Some long phrase with words"

и в моей базе данных (MySQL) у меня есть таблица tags со столбцом value. В одной строке этой таблицы будет value => 'some', в другой строке может быть value => 'long', а в другой строке может быть value => 'phra'

Что мне нужно, так это создать коллекцию всех тегов, где value появляется в моем поисковом запросе. Это означает, что 3 строки, которые я упомянул, должны соответствовать моему $search_term

В настоящее время я знаю, что могу использовать красноречие в laravel и сказать что-то вроде

Tag::where('value', 'like', "%".$search_term."%")->get()

Но, насколько я понимаю, это увидит, является ли $search_term подстрокой того, что находится в столбце value.

Как я могу использовать красноречие, чтобы спросить, содержится ли value (подстрока) в $search_term?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
2 466
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете использовать REGEXP, который представляет собой поиск по регулярному выражению. Однако, поскольку вы сравниваете поле со своей переменной, вам придется немного изменить ситуацию и использовать необработанный запрос:

 TAG::whereRaw('? REGEXP value', [$search_term])->get();

Я знаю, что вы просили красноречивое решение, но, может быть, просто решить его с помощью php? Вы можете сделать что-то вроде:

$tags = Tag::all();
$tags_found = collect([]);

foreach($tags as $tag) {
    if (strpos($search_term, $tag->value) !== false)
        $tags_found->push($tag)
}

Разделите поисковый запрос на массив отдельных слов с помощью PHP.

$search_term = "Some long phrase, with words!";

$words = preg_replace('/\W+/', ' ', $search_term);
$words = trim($words);
$words = explode(' ', $words);

Теперь $words содержит

array (
  0 => 'Some',
  1 => 'long',
  2 => 'phrase',
  3 => 'with',
  4 => 'words',
)

И вы можете искать с помощью

Tag::whereIn('value', $words)->get();

Примечание: preg_replace('/\W+/', ' ', $search_term); заменит любую последовательность символов, не являющихся словами, одним пробелом.

Я бы предпочел это, потому что не каждая строка является допустимым регулярным выражением.

TAG::whereRaw('? LIKE CONCAT("%", value, "%")',
    [$search_term])->get();

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