我正在创建一个错误跟踪工具,并试图增加查找相似错误的能力,但不包括您要搜索的错误。我正在使用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子句将其过滤掉。
答案 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);
来解决了这个问题。