nestjs - 在 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()
targetId
target
有没有办法告诉.save()
加载急切的关系,或者我是否需要使用其 ID 从数据库中取回实体才能获取它们?
我也尝试使用insert()
而不是save()
以防万一它有问题save()
,但无济于事。
谢谢!
解决方案
这对我有用:
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问题链接。
推荐阅读
- sql - 用于查找以数字 38 开头的值的 SQL 表达式
- gcc - 从头开始创建 cortex-m7 项目从哪里开始
- php - 结合 Wordpress 多个简码
- python - 我在海龟模块的 penup() 函数中遇到错误
- python - 更快地比较两个列表
- javascript - 批量创建标签二维码
- react-native - 在 react-navigation 和 FluidTransitions 中使用嵌套导航器时出错
- c# - List 之间的执行差异
和 IQueryable - android - 如何使用android远程输入将额外数据传递给广播接收器
- php - 如何检查一个字符串是否是另一个字符串的重新排序?