在其中一个子句中为none时返回数据



我有一个查询,每次都必须返回一些数据,但没有,因为我的子句andWhere导致我从查询中返回一个空列表,当它不是真的时,

我的代码:

const user = await this.conn.getRepository(User).createQueryBuilder("user")
  .where(`user.id = ${userID}`)
  .letJoin('user.orders', 'orders')
  .andWhere('orders.dateService BETWEEN ${start} AND ${end}')
  .addSelect("user.firstName", "firstName")
  .addSelect("user.lastName", "lastName")
  .getRawMany((;

这个查询返回我empty [],因为在我的子句.andWhere('orders.dateService BETWEEN ${start} AND ${end}')中我找不到任何顺序。。。

有人能告诉我,即使上面的子句返回none,如何返回我的firstNamelastName吗?

感谢的帮助

在您的查询中,条件orders.dateService BETWEEN ${start} AND ${end}实际上负责您没有任何结果。因为如果用户ID没有订单,则此条件始终为false,因为orders.dateService为NULL。

因此,您必须添加一个附加条件,允许orders.dateService为NULL。

const user = await this.conn.getRepository(User).createQueryBuilder("user")
  .where(`user.id = ${userID}`)
  .leftJoin('user.orders', 'orders')
  .andWhere(new Brackets(qb => {
        qb.where('orders.dateService BETWEEN ${start} AND ${end}')
          .orWhere('orders.dateService IS NULL')
    }))
  .addSelect("user.firstName", "firstName")
  .addSelect("user.lastName", "lastName")

这将创建(或多或少(以下SQL查询

SELECT user.firstname as firstName, user.lastName as lastName
FROM user LEFT JOIN orders ON user.id = orders.user
WHERE user.id = ${USERID} AND
  (orders.dateService BETWEEN ${start} AND ${end} OR orders.dateService IS NULL) 

最新更新