如何在PostgreSQL与TypeORM中查询时排除关联软删除数据
解决关联查询时包含软删除数据的问题
方案一:使用QueryBuilder手动过滤关联数据
用QueryBuilder替代findOne的关联查询方式,针对transactions关联添加过滤条件,排除已软删除的数据:
const product = await this.productRepository .createQueryBuilder('product') .leftJoinAndSelect('product.items', 'items') .leftJoinAndSelect('product.billingAddress', 'billingAddress') .leftJoinAndSelect('product.shippingAddress', 'shippingAddress') .leftJoinAndSelect('product.contact', 'contact') .leftJoinAndSelect('product.tax', 'tax') .leftJoinAndSelect('product.paymentTerm', 'paymentTerm') // 过滤掉已标记软删除的transaction .leftJoinAndSelect('product.transactions', 'transactions', 'transactions.deletedAt IS NULL') .leftJoinAndSelect('product.salesPerson', 'salesPerson') .where('product.id = :productId', { productId }) .getOne();
这种方式灵活可控,可单独对指定关联设置过滤规则,不会影响其他关联查询;同时即使没有未删除的transactions,也能正常返回product对象。
方案二:通过实体配置+查询条件嵌套过滤
首先确保Transaction实体已正确配置软删除字段:
import { Entity, PrimaryGeneratedColumn, DeleteDateColumn } from "typeorm"; @Entity() export class Transaction { @PrimaryGeneratedColumn() id: number; // 其他业务字段... @DeleteDateColumn() deletedAt: Date; }
之后在findOne的查询条件中嵌套关联过滤规则:
const product = await this.productRepository.findOne({ where: { id: productId, // 仅关联未删除的transactions transactions: { deletedAt: null } }, relations: [ 'items', 'billingAddress', 'shippingAddress', 'contact', 'tax', 'paymentTerm', 'transactions', 'salesPerson', ], });
注意:这种方式下,如果该产品没有未删除的transactions,查询结果可能返回null,需根据业务场景判断是否适用。
内容的提问来源于stack exchange,提问作者The sidd sight
相关产品推荐
相关产品推荐

