在 typeorm 的实体级别有条件地实现关系
Implement relation conditionally at entity level in typeorm
我有一个案例需要实现 TypeORM 的 softDelete
特性。在我的实体中的某处(我们称之为 Lead
),我有一个列映射到具有 OneToOne
关系的另一个实体(我们称之为 Customer
)。
............
@OneToOne(type => Customer, {})
@JoinColumn()
customer: Customer;
..........
这里的问题是因为软删除不会从数据库中完全删除记录,每当我从 lead
table 中删除任何记录时,我无法为相同的添加另一个潜在客户客户因为 OneToOne
关系。
在网上冲浪时,我得到了一些类似的独特约束场景的解决方案,比如使用:
- 部分索引&
- 虚拟列
但在这里我在映射关系时寻找某种 TypeORM 级别的解决方案。对于这种情况,最好的解决办法是什么?
TypeORM 中的一对一关系默认创建一个唯一的外键约束。虽然该行是来自潜在客户 table 的 soft-deleted,但 table 中仍然会有一个唯一值。因此,在为同一个客户插入另一个线索时,TypeORM 将抛出一个唯一约束错误。
此问题的解决方案是从关系中删除外键约束。现在,这将允许我们在 Lead table.
中插入相同 customerId 的数据
现在我们要确定的是:
- 在潜在客户 table 中插入值之前,检查是否已经存在未软删除的该 customerId 的另一个潜在客户。
- 我们还必须确保在从客户 table 中删除任何客户之前,他们的特定潜在客户是来自潜在客户 table 的 soft-deleted。
P.S:在某种程度上,这个解决方案是一个 hacky 解决方案。但是由于软删除不考虑外键约束引用,所以这是我目前找到的 suitable 方式。
我有一个案例需要实现 TypeORM 的 softDelete
特性。在我的实体中的某处(我们称之为 Lead
),我有一个列映射到具有 OneToOne
关系的另一个实体(我们称之为 Customer
)。
............
@OneToOne(type => Customer, {})
@JoinColumn()
customer: Customer;
..........
这里的问题是因为软删除不会从数据库中完全删除记录,每当我从 lead
table 中删除任何记录时,我无法为相同的添加另一个潜在客户客户因为 OneToOne
关系。
在网上冲浪时,我得到了一些类似的独特约束场景的解决方案,比如使用:
- 部分索引&
- 虚拟列
但在这里我在映射关系时寻找某种 TypeORM 级别的解决方案。对于这种情况,最好的解决办法是什么?
TypeORM 中的一对一关系默认创建一个唯一的外键约束。虽然该行是来自潜在客户 table 的 soft-deleted,但 table 中仍然会有一个唯一值。因此,在为同一个客户插入另一个线索时,TypeORM 将抛出一个唯一约束错误。
此问题的解决方案是从关系中删除外键约束。现在,这将允许我们在 Lead table.
中插入相同 customerId 的数据现在我们要确定的是:
- 在潜在客户 table 中插入值之前,检查是否已经存在未软删除的该 customerId 的另一个潜在客户。
- 我们还必须确保在从客户 table 中删除任何客户之前,他们的特定潜在客户是来自潜在客户 table 的 soft-deleted。
P.S:在某种程度上,这个解决方案是一个 hacky 解决方案。但是由于软删除不考虑外键约束引用,所以这是我目前找到的 suitable 方式。