【问题标题】:Implement relation conditionally at entity level in typeorm在 typeorm 的实体级别有条件地实现关系
【发布时间】:2022-02-24 03:26:45
【问题描述】:

我有一个案例需要实现 TypeORM 的softDelete 功能。在我的实体中的某个地方(我们称之为Lead),我有一列映射到另一个实体(我们称之为Customer),关系为OneToOne

............ 

@OneToOne(type => Customer, {})
@JoinColumn()
customer: Customer;

..........

这里的问题是,因为软删除不会完全从数据库中删除记录,所以每当我从 lead 表中删除任何记录时,由于 OneToOne 关系,我无法为同一客户添加另一个潜在客户. 在网上冲浪时,我得到了一些针对类似独特约束场景的解决方案,例如使用:

  • 部分索引 &
  • 虚拟列

但在这里,我正在寻找某种类型的 TypeORM 级别的解决方案,同时映射关系。对于这种情况,最好的办法是什么?

【问题讨论】:

    标签: postgresql nestjs typeorm node.js-typeorm


    【解决方案1】:

    TypeORM 中的一对一关系默认创建一个唯一的外键约束。尽管该行已从 Lead 表中软删除,但表中仍然存在唯一值。因此,在为同一个客户插入另一个潜在客户时,TypeORM 会抛出一个独特的约束错误。

    此问题的解决方案是从关系中删除外键约束。现在,这将允许我们在 Lead 表中插入相同 customerId 的数据。

    现在我们要确定的是:

    1. 在潜在客户表中插入值之前,检查是否已经存在该 customerId 的未软删除的另一个潜在客户。
    2. 我们还必须确保在从 Customer 表中删除任何客户之前,他们的特定潜在客户已从 Lead 表中软删除。

    P.S:在某种程度上,这个解决方案是一个 hacky 解决方案。但是由于软删除不考虑外键约束引用,所以这是我目前找到的合适的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 2021-10-27
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 2019-04-24
      相关资源
      最近更新 更多