如何在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
相关产品推荐
相关产品推荐

