You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeORM与NestJS中为关联表添加WHERE条件?

在TypeORM中为关联表添加WHERE条件的正确方式

方法1:使用find选项的嵌套WHERE对象

如果是简单的关联表条件,可直接在where选项里嵌套关联实体的字段,TypeORM会自动处理关联查询。比如要过滤listing表中is_active为true的记录,代码调整如下:

findAllByUserId(userId: number) {
  return this.reservationRepository.find({
    relations: ['listing', 'listing.favourite'],
    where: { 
      user_id: userId,
      // 嵌套关联实体的条件
      listing: {
        is_active: true,
        // 可添加更多listing字段条件,例如id: 123
      }
    }
  });
}

注意:这种方式下,TypeORM会将关联查询转为内连接,仅返回满足listing条件的Reservation记录。若需保留关联表为null的记录(左连接),建议使用QueryBuilder自定义连接逻辑。

方法2:使用QueryBuilder(推荐复杂场景)

QueryBuilder提供更灵活的查询控制,适合多条件、自定义连接类型的场景。示例如下,包含左连接并添加关联表条件:

findAllByUserId(userId: number) {
  return this.reservationRepository
    .createQueryBuilder('reservation')
    // 左连接并选择关联的listing和favourite
    .leftJoinAndSelect('reservation.listing', 'listing')
    .leftJoinAndSelect('listing.favourite', 'favourite')
    // 主表筛选条件
    .where('reservation.user_id = :userId', { userId })
    // 关联表筛选条件(若用andWhere,会过滤掉listing为null的记录;若要保留,将条件移至leftJoin的第三个参数)
    .andWhere('listing.is_active = :isActive', { isActive: true })
    // 保留listing为null记录的写法:
    // .leftJoinAndSelect('reservation.listing', 'listing', 'listing.is_active = :isActive', { isActive: true })
    .getMany();
}

关键注意事项

  • 使用find选项嵌套where时,关联条件默认触发内连接,会过滤掉关联表无匹配的记录。
  • QueryBuilder可明确指定连接类型(leftJoin/innerJoin),并灵活控制条件是放在where子句还是join的on子句中。
  • 多层关联(如listing.favourite)的条件也可同理处理:
    • 嵌套方式:where: { user_id: userId, listing: { favourite: { user_id: userId } } }
    • QueryBuilder方式:.andWhere('favourite.user_id = :favUserId', { favUserId: userId })

内容的提问来源于stack exchange,提问作者Robin Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 03:21:15