在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
回调或then()
事件侦听器中,afterInsert()
的关系都无法解析。 targetId
字段具有正确的值,但是target
未定义。
是否有一种方法可以告诉.save()
加载渴望的关系,或者我是否需要使用其ID从数据库中获取实体以获取它们?
我还尝试使用insert()
而不是save()
,以防万一save()
出了问题。
谢谢!
答案 0 :(得分:0)
这对我有用:
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
(不使用 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 问题链接。