如何使我的 SQL 查询搜索句子中的几个词,即使它们不相互跟随
How to make my SQL query search several words in the sentence even if they do not follow each other
我的搜索表单有一个 SQL 查询。
$term = $request->get('term');
$queries = Article::where('title', 'LIKE', '%' . $term . '%')->published()->get();
我的研究正在进行。如果我有一篇名为 "my great article is awesome" 的文章,并且我在我的搜索表单 "greate article" 中写了它,它就有效。
但是如果我写"article awesome",单词不会互相跟随,它不起作用。
如何让我的查询只使用关键字?
谢谢
你为什么不试试这样的东西
$search = "article awesome";
$search = preg_replace("#\s+#", '%', $search);
用“%”替换空格将解决您提到的情况
您可以执行如下操作:
$term = $request->get('term');
$keywords = explode(" ", $term);
$article = Article::query();
foreach($keywords as $word){
$article->orWhere('title', 'LIKE', '%'.$word.'%');
}
$articles = $article->published()->get();
如果您只想要包含查询中所有单词的结果,只需将 orWhere
替换为 where
。
如果您想过滤掉某些字词,您可以添加如下内容:
$filtered = ["a", "an", "the"];
$filteredKeywords = array_diff($keywords, $filtered);
或者,如果你想更动态,你可以传递一个闭包:
$filteredKeywords = array_filter($keywords, function($word) {
return strlen($word) > 2;
});
如果您想忽略单词顺序进行搜索,这应该可行
$search = trim(" article awesome great ");
$search = preg_split("#\s+#", $search);
$where = "WHERE column like '%" . implode( "%' AND column like '%", $search ) . "%'";
但是它会占用更多的执行时间和服务器资源,
还考虑添加一些注入转义以避免sql语法错误
我的搜索表单有一个 SQL 查询。
$term = $request->get('term');
$queries = Article::where('title', 'LIKE', '%' . $term . '%')->published()->get();
我的研究正在进行。如果我有一篇名为 "my great article is awesome" 的文章,并且我在我的搜索表单 "greate article" 中写了它,它就有效。
但是如果我写"article awesome",单词不会互相跟随,它不起作用。
如何让我的查询只使用关键字?
谢谢
你为什么不试试这样的东西
$search = "article awesome";
$search = preg_replace("#\s+#", '%', $search);
用“%”替换空格将解决您提到的情况
您可以执行如下操作:
$term = $request->get('term');
$keywords = explode(" ", $term);
$article = Article::query();
foreach($keywords as $word){
$article->orWhere('title', 'LIKE', '%'.$word.'%');
}
$articles = $article->published()->get();
如果您只想要包含查询中所有单词的结果,只需将 orWhere
替换为 where
。
如果您想过滤掉某些字词,您可以添加如下内容:
$filtered = ["a", "an", "the"];
$filteredKeywords = array_diff($keywords, $filtered);
或者,如果你想更动态,你可以传递一个闭包:
$filteredKeywords = array_filter($keywords, function($word) {
return strlen($word) > 2;
});
如果您想忽略单词顺序进行搜索,这应该可行
$search = trim(" article awesome great ");
$search = preg_split("#\s+#", $search);
$where = "WHERE column like '%" . implode( "%' AND column like '%", $search ) . "%'";
但是它会占用更多的执行时间和服务器资源,
还考虑添加一些注入转义以避免sql语法错误