移除和删除有什么区别?

81
例如,我有一个 TypeORM 实体 Profile
@Entity()
class Profile {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    gender: string;

    @Column()
    photo: string;

    @OneToOne(type => User, { cascade: true })
    @JoinColumn()
    user: User;
}

我不确定要使用哪个来删除用户配置文件?

Profile.remove(profile)
Profile.delete(profile)

TypeORM中的remove方法和delete方法有什么区别?


我猜它们的含义在这里描述了?https://github.com/typeorm/typeorm/blob/master/docs/entity-manager-api.md remove() 是当你有一个 profile 对象时应该使用的,而 delete() 则是基于条件删除。 - Ry-
1个回答

138

来自Repo:

  • remove - 删除给定的实体或实体数组。它在单个事务中删除所有给定的实体(在实体的情况下,管理器不是事务性的)。

示例:

await repository.remove(user);
await repository.remove([
    category1,
    category2,
    category3
]);
  • delete - 通过实体ID、IDs或给定条件删除实体:

示例:

await repository.delete(1);
await repository.delete([1, 2, 3]);
await repository.delete({ firstName: "Timber" });

如例此处所述:

import {getConnection} from "typeorm";

await getConnection()
    .createQueryBuilder()
    .delete()
    .from(User)
    .where("id = :id", { id: 1 })
    .execute();

这意味着如果包含实体数组,则应使用“remove”。而如果您知道条件,则应使用“delete”。

此外,正如@詹姆斯评论中所述,在实体侦听器(例如@BeforeRemove@AfterRemove)中,只有当使用repository.remove删除实体时才会触发它们。

同样地,@BeforeInsert@AfterInsert@BeforeUpdate@AfterUpdate 只有在使用repository.save插入/更新实体时才会触发。

来源:实体侦听器和订阅者


28
请注意,repository.delete 不会触发 @Before/After Remove 的监听器,只有 repository.remove 才会触发。同样地,repository.update 不会触发 @Before/After Update 的监听器,只有 repository.save 才会触发。 - James
鉴于没有@AfterDelete方法,如何获取最近删除/移除实体的id?我试图使用beforeRemove,但它无法访问底层文档/行。 - Harrison Cramer
@HarryCramer 如在问题讨论中提到的那样,“订阅者没有beforeDelete/afterDelete方法。您需要使用remove方法来获取实体信息”。 - Mukyuu
1
在文档中没有找到,但是 remove() 似乎也通过删除 id 字段来改变传递的对象... - Klesun
无法理解 remove 方法,从数据库表结构的角度来看,它是如何删除实体的?它是否清除与该实体关联的整个表? - Muhammad Awais
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接