首页 > 解决方案 > 在 afterInsert 和 afterUpdate 中的 TypeORM 急切关系

问题描述

在 TypeORM 中,我有一个订阅者(实现 EntitySubscriberInterface 的类),它监听afterInsert事件afterUpdate。这是重现我的问题的最小实体:

@Entity()
export class MainEntity {
  @ManyToOne(type => Target, { eager: true })
  @JoinColumn({ name: 'targetId' })
  target: Target;
  @Column()
  targetId: string;
}

使用时急切关系有效(加载)mainEntity.find(),但如果我使用:

   mainEntity.save({targetId: 'valid_id'}).then((result) => console.log(result))

在回调或事件侦听器.target中都没有解决for 的关系。该字段具有正确的值,但未定义。then()afterInsert()targetIdtarget

有没有办法告诉.save()加载急切的关系,或者我是否需要使用其 ID 从数据库中取回实体才能获取它们?

我也尝试使用insert()而不是save()以防万一它有问题save(),但无济于事。

谢谢!

标签: nestjstypeorm

解决方案


这对我有用:

  async afterInsert(event: InsertEvent<any>) {
    // User.role eager relation
    let entity: User = event.entity;
    entity = await event.manager.getRepository(User).findOne(entity.id);
    const role: Role = entity.role;
  }

event.manager仅使用(w/o getRepository,但不知道有什么区别导致此问题)。

如果使用管理器,需要在检索之前再次保存实体。否则event.manager.findOne(entity.id);会抛出错误。

  async afterInsert(event: InsertEvent<any>) {
    let entity: User = event.entity;
    await event.manager.save(entity);
    entity = await event.manager.findOne(entity.id);
    const role: Role = entity.role;
  }

参考this answer和评论中的github问题链接。


推荐阅读