我有多个嵌套的where条件,并且希望在使用typeORM生成它们时没有太多的代码重复。
SQL where条件应该是这样的:
WHERE "Table"."id" = $1
AND
"Table"."notAvailable" IS NULL
AND
(
"Table"."date" > $2
OR
(
"Table"."date" = $2
AND
"Table"."myId" > $3
)
)
AND
(
"Table"."created" = $2
OR
"Table"."updated" = $4
)
AND
(
"Table"."text" ilike '%search%'
OR
"Table"."name" ilike '%search%'
)
但是对于FindConditions
,似乎不可能使它们嵌套,所以我必须在FindConditions数组中使用AND
的所有可能组合。并且不可能将其拆分为.where()
和.andWhere()
,因为andWhere
不能使用Object Literal。
有没有其他的可能性来实现这个查询与typeORM不使用原始SQL?
5条答案
按热度按时间zlwx9yxi1#
当使用queryBuilder时,我建议使用Typeorm文档中所述的
Brackets
:https://typeorm.io/#/select-query-builder/adding-where-expression你可以这样做:
这将导致:
jhdbpxl92#
我认为你混合了从TypeORM检索实体的两种方式,从存储库中查找和查询构建器。
FindConditions
用于查找函数。andWhere
函数由查询构建器使用。当构建更复杂的查询时,通常使用查询构建器更好/更容易。查询构建器
当使用查询构建时,你有更多的自由来确保查询是你所需要的。在这里你可以自由地添加任何SQL,只要你喜欢:
请注意,根据您使用的数据库,您在这里使用的实际SQL需要兼容。使用这种方法也可能会带来一个可能的缺点。您将把您的项目绑定到特定的数据库。确保阅读有关您可以设置的表的别名的信息,如果您使用关系,这将很方便。
仓库
您已经看到,这是不太舒服的。这是因为
find
函数或更具体的findOptions
使用对象来构建where子句。这使得很难实现一个适当的接口来并行实现嵌套的AND
和OR
子句。(我假设)他们选择了拆分AND
和OR
子句。这使得接口更具声明性,这意味着你必须将OR
子句拉到顶部:我无法想象看一个所需的查询的大小,这段代码将是非常高性能的。
或者,你可以使用
Raw
find helper。这需要你重写每个字段的子句,因为你一次只能访问一个别名。你可以猜测列名或别名,但这是非常糟糕的做法,而且非常不稳定,因为你不能直接控制它。vbopmzt13#
如果要在满足条件时嵌套andWhere语句,以下是一个示例:
}
92dk7w1h4#
我有一份名单
我的解决办法是
会产生类似的东西
plicqrtu5#
是的,如果我们使用querybuilder(),那么我们可以使用太多的选项。
别担心,我们可以像querybuilder()一样做下面有一个使用
NOT
的例子,还有LIKE
用于搜索/查询。之后,我们可以将
response
作为json
数据发送。