TypeORM queryBuilder 中的可选参数

Posted

技术标签:

【中文标题】TypeORM queryBuilder 中的可选参数【英文标题】:Optional parameter in TypeORM queryBuilder 【发布时间】:2020-10-24 04:21:45 【问题描述】:

createQueryBuilder中是否可以使用可选参数?

例如,我有这个代码:

let users = await this.conn
  .getRepository(UserEntity)
  .createQueryBuilder("user")
  .where("user.firstName LIKE :search",  search: dto.search )
  .getMany();

我的可选参数是search,我只想在dto.search不为空时启动子句.where,但当他为空时应该跳过这个函数(where)并转到getMany

有人知道怎么做吗?

【问题讨论】:

【参考方案1】:
const query = this.conn
  .getRepository(UserEntity)
  .createQueryBuilder("user");

// Optionally add where condition
if(dto.search)
  query.where("user.firstName LIKE :search",  search: dto.search )

// run query
let users = await query.getMany();

请注意会导致 if 语句出错的虚假值。

【讨论】:

【参考方案2】:

试试这个:

let users = await this.conn.getRepository(UserEntity)
  .createQueryBuilder('user')
  .where(search !== null 
    ? 'user.firstName LIKE :search'
    : 'TRUE',  search: dto.search )
  .getMany();

或者不使用where TRUE 的另一种方法是:

let users = this.conn.getRepository(UserEntity)
  .createQueryBuilder('user');
users = search !== null 
  ? users.where('user.firstName LIKE :search', search: dto.search )
  : users
users = await users.getMany();

【讨论】:

小心这部分search !== null。它不会考虑 dto.search 未定义或具有零长度字符串值的情况。这可能会导致查询结果不准确。

以上是关于TypeORM queryBuilder 中的可选参数的主要内容,如果未能解决你的问题,请参考以下文章

在 TypeORM 中使用 QueryBuilder 与 Repository 都有哪些不同的用例? [关闭]

NestJS 中的 TypeORM - 如何在实体中获取 MySQL 嵌套对象并对子关系进行“位置”查询?

可选类中的可选属性 VS 可选字典中的可选值

Java 中的可选 orElse 可选

Swift 中的可选值是啥?

JavaScript中的可选参数[重复]