我有一对多关系中的组和联系人实体。我在组内添加联系人。当我要删除的时候,我希望数据库的两边都被删除。但只删除了组表。
这里是
contact.entity
这是一对多关系:
这里是
group.entity
我在服务中写的函数如下:
我通过搜索尝试了很多解决方案。在两侧添加级联,我知道这是不对的,但我想尝试,但我无法让它工作。
你的使用方式不对。 如果您将鼠标悬停到 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"})
不要对数据库本身可以完成的事情进行硬编码。如果您希望在删除组时删除该组的所有联系人,请使用外键
关于删除级联
例如:
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
);
您正在执行软删除,因此您应该向父实体添加一个
{ 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
选项将配置表中的约束(基于数据库级别)
您需要将
onDelete: "CASCADE"
添加到两个实体,即群组和联系人。你的进步看起来很棒,但是,你应该像这样更新 group.entity @OneToMany()
装饰器:
@OneToMany(() => Contact, contact => contact.group, {
onDelete: "CASCADE"
})