在Laravel 6中搜索以空格分隔的多个单词不起作用

时间:2020-06-10 00:54:14

标签: mysql laravel eloquent

我已经阅读了几篇类似的文章,并尝试了它们,但仍然不适用于我的网站。

当我搜索单词“ think”时,搜索结果显示“我认为就是这样”。 但是,当我搜索“我认为”时,结果是“找到0个匹配项”。

所以要实现多个单词的搜索,我做了以下工作:

Controller.php

$keyword = "I think"

$words = explode(' ', $keyword);

$data = Post::where(function ($query) use ($words) 
{
  foreach($words as $word){
     $query->where('example', 'LIKE', '%' . $word . '%');
  }
})->get();

但是,结果是相同的。 “思考”显示结果。 “我认为”没有任何结果。

还使用dd($data)

进行了调试
// $keyword = "think"
"select * from `posts` where (`example` LIKE ?)"
// $keyword = "I think"
"select * from `posts` where (`example` LIKE ? and `example` LIKE ?)"

那怎么了?谢谢。

[附加信息(已编辑)]

$bindings = $query->getBindings();
dd($bindings);

// array:2 [▼
  0 => "%I%"
  1 => "%think%"
]

2 个答案:

答案 0 :(得分:1)

我建议为此使用Laravel侦察兵。但也可以在sql中执行模糊文本搜索。 或者...假设我们不使用MYSQL匹配功能,而我们使用的是雄辩的laravel。 1)分割字符串。 2)使用查询生成器。

$words = explode(' ', $searchString);
$results = Post::where(($q) use ($words) {
   $firstWord = array_shift($words);
   $q->where('example', $firstCase);
    foreach($words as $word) {
      $q->orWhere('example', $word);
   }
})->get();

答案 1 :(得分:0)

已解决

那是我的坏事。 在我的blade.php上,有一行

@if (preg_match("/^[0-9a-zA-Z]*$/",$keyword)) 

此正则表达式没有空格,这就是为什么它不起作用的原因。 所以只需更改为:

@if (preg_match("/^[0-9a-zA-Z ]*$/",$keyword)) 

然后完全奏效了。

感谢您对老师的帮助。

相关问题