TypeORM:如何处理对关系ID的可选查询

时间:2020-07-09 14:53:05

标签: typescript typeorm

我有一个用于检索用户应用程序的服务,该服务接受可选参数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 } }),
      },
    })
  }
}

但是我正在寻找一种更通用/更精细的方法,因为将来我可以拥有多个可选参数,并且必须像这样散布它们很丑陋并且容易出错。更不用说代码不可读了。

1 个答案:

答案 0 :(得分:0)

一项服务?但是,您使用什么框架? NestJS?看起来有点像,但不是很惯用。

对于更复杂的查询,尤其是条件很多的查询,我建议使用TypeORM QueryBuilder代替。

请参阅以下文档:

https://typeorm.io/#/select-query-builder

您可以为代码可读性进行拆分。

例如,以const query = [...].createQueryBuilder('example')开头 然后您可以使用各种可用方法(例如queryaddSelect().where()andWhere()等有条件地将子句添加到.innerJoin()中以.getOne().getRawOne().getMany().getRawMany()结尾。

关于TypeORM,请谨慎假设其如何处理undefined。如果希望在Not查询中明确显示,请从typeorm包中检出IsNullfind()等。