我目前在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
(子字符串)?
答案 0 :(得分:1)
您可以使用REGEXP,这是一个正则表达式搜索。但是,由于要将字段与变量进行比较,因此您将不得不进行一些切换并使用原始查询:
[a-zA-Z]+,\d+,
答案 1 :(得分:1)
我更愿意这样做,因为并非每个字符串都是有效的正则表达式。
TAG::whereRaw('? LIKE CONCAT("%", value, "%")',
[$search_term])->get();
答案 2 :(得分:0)
我知道您要求一个雄辩的解决方案,但也许只是用php解决它?您可以执行以下操作:
$tags = Tag::all();
$tags_found = collect([]);
foreach($tags as $tag) {
if(strpos($search_term, $tag->value) !== false)
$tags_found->push($tag)
}
答案 3 :(得分:0)
使用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);
将用单个空格替换任何非单词字符序列。