我有一个用于检索用户应用程序的服务,该服务接受可选参数listingId
(这是应用程序的关系),并且有一个固定的WHERE子句,用于user.id
等于传入的已认证请求中的一个:
@Injectable()
export class ApplicationsService {
constructor(@Inject(REQUEST) private readonly request: any) {}
async list(listingId?: string) {
return Application.find({
where: {
user: { id: this.request.user.id },
listing: { id: listingId }
},
})
}
}
不幸的是,上述实现返回一个空数组。可能是因为{ listing: { id: undefined } }
导致了“ IS NULL”查询,对吗?我找到了解决方法:
@Injectable()
export class ApplicationsService {
constructor(@Inject(REQUEST) private readonly request: any) {}
async list(listingId?: string) {
return Application.find({
where: {
user: { id: this.request.user.id },
...(listingId && { listing: { id: listingId } }),
},
})
}
}
但是我正在寻找一种更通用/更精细的方法,因为将来我可以拥有多个可选参数,并且必须像这样散布它们很丑陋并且容易出错。更不用说代码不可读了。
答案 0 :(得分:0)
一项服务?但是,您使用什么框架? NestJS?看起来有点像,但不是很惯用。
对于更复杂的查询,尤其是条件很多的查询,我建议使用TypeORM QueryBuilder代替。
请参阅以下文档:
https://typeorm.io/#/select-query-builder
您可以为代码可读性进行拆分。
例如,以const query = [...].createQueryBuilder('example')
开头
然后您可以使用各种可用方法(例如query
,addSelect()
,.where()
,andWhere()
等有条件地将子句添加到.innerJoin()
中以.getOne()
,.getRawOne()
,.getMany()
,.getRawMany()
结尾。
关于TypeORM,请谨慎假设其如何处理undefined
。如果希望在Not
查询中明确显示,请从typeorm包中检出IsNull
,find()
等。