В настоящее время я работаю над проектом 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?






Вы можете использовать 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();