Использование Laravel eloquent для поиска, если значение в столбце базы данных появляется в строке поиска - PullRequest
1 голос
/ 22 марта 2019

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

$search_term = "Some long phrase with words"

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

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

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

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

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

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

Ответы [ 4 ]

1 голос
/ 24 марта 2019

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

TAG::whereRaw('? LIKE CONCAT("%", value, "%")',
    [$search_term])->get();
1 голос
/ 22 марта 2019

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

 TAG::whereRaw('? REGEXP value', [$search_term])->get();
0 голосов
/ 22 марта 2019

Разделите ваш поисковый запрос на массив из отдельных слов, используя 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); заменит любую последовательность несловарных символов одним пробелом.

0 голосов
/ 22 марта 2019

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

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

foreach($tags as $tag) {
    if(strpos($search_term, $tag->value) !== false)
        $tags_found->push($tag)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...