文字比对SQL查询,可根据主题找到类似的比对,但限制完全比对

时间:2018-12-11 23:27:07

标签: sql laravel postgresql eloquent laravel-5.7

我正在创建一个错误跟踪工具,并试图增加查找相似错误的能力,但不包括您要搜索的错误。我正在使用Laravel 5.7 / eloquent和postgreSQL。当前的原始查询如下:

SELECT 
    * 
FROM bugs 
WHERE 
    subject::text like 'Delectus iusto est architecto magni expedita eum rerum consequatur.' 
OR 
    description::text like 'Delectus iusto est architecto magni expedita eum rerum consequatur.'
AND 
    id <> 'e0433097-d2b0-49ac-8aea-fcdbefa378b5'

雄辩的版本被提取到BugSearch类中,但实际上是这样做的:

$builder = DB::table('bugs');
$builder->where('subject', 'like', $bug->subject)
        ->orWhere('description', 'like', $bug->description);

并返回生成器,这时我尝试添加where子句:

$matches = $builder->where('id', '!=', $bug->id)->get();
return response()->json($matches);

这显然不能作为原始查询或雄辩的查询生成器使用,因为两者都返回完全匹配项,需要使用where子句将其过滤掉。

2 个答案:

答案 0 :(得分:1)

您没有在查询中明确说出什么是“无效” ...

但是,根据您的帖子,您可能只是遇到了操作员优先问题。 and的优先级比or高,因此您可能想将or放入括号中。

此外,如果您想使用LIKE运算符,则需要在搜索字符串中使用百分号(%)。

select * from bugs 
where 
( 
    subject::text like '%Delectus iusto est architecto magni expedita eum rerum consequatur.%' 
    or description::text like '%Delectus iusto est architecto magni expedita eum rerum consequatur.%' 
)
and id <> 'e0433097-d2b0-49ac-8aea-fcdbefa378b5' 

没有括号,查询实际上等效于:

select * from bugs 
where 
subject::text like 'Delectus iusto est architecto magni expedita eum rerum consequatur.' 
or 
( 
    or description::text like 'Delectus iusto est architecto magni expedita eum rerum consequatur.' 
    and id <> 'e0433097-d2b0-49ac-8aea-fcdbefa378b5' 
)
order by created_at desc

答案 1 :(得分:1)

我实际上通过在BugSearch类的构造函数中传递->where('id', '!=', $bug->id);来解决了这个问题。