簡體   English   中英

使用Laravel雄辯地搜索數據庫字符串中的值是否出現在搜索字符串中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM