[英]Using Laravel eloquent to search if a value in a database column appears in search string
我目前在laravel 5.4項目中工作,試圖在數據庫中查找與引入的搜索字符串相似的值。 例如,我有以下搜索詞
$search_term = "Some long phrase with words"
在我的數據庫(MySQL)中,我有一個帶有列value
的表tags
。 該表中的一行將具有value => 'some'
,另一行可能具有value => 'long'
,另一行可能具有value => 'phra'
我需要創建一個所有標簽的集合,其中value
出現在我的搜索詞中。 這意味着我提到的3行應該與我的$search_term
匹配
我目前知道我可以在laravel中使用口才,並說出類似
Tag::where('value', 'like', "%".$search_term."%")->get()
但是據我所知,這將查看$search_term
是否為value
列中的子字符串。
我該如何用雄辯的方式詢問$search_term
是否包含value
(子字符串)?
您可以使用REGEXP,這是一個正則表達式搜索。 但是,由於您要將字段與變量進行比較,因此您將不得不進行一些切換並使用原始查詢:
TAG::whereRaw('? REGEXP value', [$search_term])->get();
我寧願這樣,因為並非每個字符串都是有效的正則表達式。
TAG::whereRaw('? LIKE CONCAT("%", 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);
將用單個空格替換任何非單詞字符序列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.