使用Laravel雄辩地搜索数据库字符串中的值是否出现在搜索字符串中

时间:2019-03-22 18:21:34

标签: php mysql laravel laravel-5 eloquent

我目前在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(子字符串)?

4 个答案:

答案 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);将用单个空格替换任何非单词字符序列。