如何在typeORM中使用一对多关系进行级联删除?

问题描述 投票:0回答:4

我有一对多关系中的组和联系人实体。我在组内添加联系人。当我要删除的时候,我希望数据库的两边都被删除。但只删除了组表。

这里是

contact.entity
contact.entity

这是一对多关系:

这里是

group.entity
group.entity

我在服务中写的函数如下: function in the service

我通过搜索尝试了很多解决方案。在两侧添加级联,我知道这是不对的,但我想尝试,但我无法让它工作。

javascript typescript postgresql nestjs typeorm
4个回答
0
投票

你的使用方式不对。 如果您将鼠标悬停到 softDelete 函数,您会看到它需要如下道具:

(method) Repository<Group>.softDelete(criteria: string | number | Date | ObjectID | string[] | FindConditions<Group> | number[] | Date[] | ObjectID[]

这意味着你必须像这样使用它:

getRepository(Group).softDelete({ id: groupId})

与更新功能相同:

getRepository(Group).update({id: groupId}, {name: "new name"})

0
投票

不要对数据库本身可以完成的事情进行硬编码。如果您希望在删除组时删除该组的所有联系人,请使用外键

关于删除级联

例如:

create table group1(
id serial primary key,
name varchar
);

create table contact(
id serial primary key,
name varchar,
group_id integer references group1 (id) on delete cascade
);

结果在这里


0
投票

您正在执行软删除,因此您应该向父实体添加一个

{ cascade: ['soft-delete'] }
选项,在本例中为
Group
是:

@OneToMany(Contact, (contact) => contact.group, { cascade: ['soft-delete'] })
contact: Contact[]

以防万一,

ON DELETE
约束是基于数据库级别的,
soft-delete
是基于代码级别的,因此ORM将触发
UPDATE
来更改实体的
deleted_at
列中的时间。

考虑到上述内容,

cascade
选项将配置当父实体中发生更改时ORM的行为方式(基于代码级别),
onDelete
选项将配置表中的约束(基于数据库级别)


0
投票

您需要将

onDelete: "CASCADE"
添加到两个实体,即群组和联系人。你的进步看起来很棒,但是,你应该像这样更新
group.entity @OneToMany()
装饰器:

@OneToMany(() => Contact, contact => contact.group, {
  onDelete: "CASCADE"
})
© www.soinside.com 2019 - 2024. All rights reserved.