0

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

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

所以为了实现多词搜索,我做了以下:

控制器.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%"
]
4

3 回答 3

1

我建议为此使用 Laravel scout。但或者,在 sql 中进行模糊文本搜索。或者...假设我们不使用 MYSQL 匹配功能,而我们使用的是 laravel eloquent。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();
于 2020-06-10T01:42:34.243 回答
0

解决了

这是我的错。在我的blade.php 上,有一行

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

这个正则表达式没有空间,这就是它不起作用的原因。所以只是改为:

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

然后它完全奏效了。

谢谢老师们的帮助。

于 2020-06-12T14:47:48.500 回答
0
$users = User::where(function ($query) use($userSearch) {
        $searchWords = explode(' ', $userSearch);
        $query->where('name', 'like', '%'.$searchWords[0].'%');
        for($i=1;$i<count($searchWords);$i++) {
            $query->where('name', 'like', '%'.$searchWords[$i].'%');
        }
    })->get();
于 2021-09-20T07:22:46.163 回答