【问题标题】:Search multiple words separated by space in laravel 6 doesn't work在laravel 6中搜索由空格分隔的多个单词不起作用
【发布时间】:2020-06-10 00:54:14
【问题描述】:

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

当我搜索“认为”一词时,搜索结果显示“我认为就是这样”。 但是,当我搜索“我认为”时,结果是“找到 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%"
]

【问题讨论】:

  • 您也可以在这里发布您的绑定输出吗? $query->getBindings();
  • @ITDesigns-eu 我添加了。
  • 我认为你现在的问题是你的问题:) 你的绑定应该看起来像%I%, %think%。所以问题出在你的 $keyword 上……你确定 I 和 think 之间的空格与 explode 函数中的空格一样吗?
  • 另外,你不需要打破我认为LIKE "%I think%" 应该可以正常工作
  • @ITDesigns-eu 感谢您的建议!所以我检查了print_r($words); 然后结果是Array ( [0] => I [1] => think ) 所以 $keyword explode 看起来仍然有效。同样不使用explode,搜索必须去LIKE "%I think%",但是,仍然是相同的结果。它不起作用。嗯...

标签: mysql laravel eloquent


【解决方案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();

【讨论】:

    【解决方案2】:

    已解决

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

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

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

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

    然后它完全起作用了。

    感谢老师们的帮助。

    【讨论】:

      【解决方案3】:
      $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();
      

      【讨论】:

        猜你喜欢
        • 2015-03-31
        • 2013-06-04
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        • 2021-05-19
        • 1970-01-01
        • 2015-11-10
        • 1970-01-01
        相关资源
        最近更新 更多