如何使我的SQL查询在句子中搜索几个单词,即使它们不相互跟随

时间:2017-05-17 23:14:15

标签: php mysql laravel eloquent laravel-eloquent

我的搜索表单有一个SQL查询。

$term = $request->get('term');

$queries = Article::where('title', 'LIKE', '%' . $term . '%')->published()->get();

我的研究正在进行中。如果我有一篇名为“我的伟大文章很棒”的文章,并且我在我的搜索表单“greate article”中写道,那就有用了。

但如果我写“文章很棒”,那么这些词就不会互相影响,而且它不起作用。

如何让我的查询仅使用关键字?

谢谢

3 个答案:

答案 0 :(得分:8)

您可以执行以下操作:

$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;
});

答案 1 :(得分:1)

你为什么不尝试这样的事呢

CMP EAX,ECX
    JG More
    JL Less
Equal:
    ;... do something
    RETN
More:
    ;... do something different from "equal" and "less"
    RETN
Less:
    ;... do something different from "more" and "equal"
    RETN

用'%'替换空格将解决您提到的案例

答案 2 :(得分:0)

如果你想让搜索忽略单词这个应该起作用的话

$search = trim(" article awesome great ");
$search = preg_split("#\s+#", $search);
$where =  "WHERE column like '%" .  implode( "%' AND column like '%", $search ) . "%'";

然而,服务器上需要更多的执行时间和资源,

还考虑添加一些注入转义以避免sql语法错误