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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:17:15