【发布时间】:2021-01-13 04:19:56
【问题描述】:
我有 2 个实体:
- 用户
- 促销
我想创建一个促销实体, 每次创建/插入用户实体时,它与用户实体具有 oneToOne 关系。
我是 typeorm 的新手,所以我不确定实现这一目标的最佳方法是什么。
我尝试使用订阅者似乎无法实现所需的功能。 另一种选择是在 GraphQL Resolver 中执行此操作,但这对我来说似乎很乱。
在尝试执行此操作时,什么被认为是最佳做法?
【问题讨论】:
我有 2 个实体:
我想创建一个促销实体, 每次创建/插入用户实体时,它与用户实体具有 oneToOne 关系。
我是 typeorm 的新手,所以我不确定实现这一目标的最佳方法是什么。
我尝试使用订阅者似乎无法实现所需的功能。 另一种选择是在 GraphQL Resolver 中执行此操作,但这对我来说似乎很乱。
在尝试执行此操作时,什么被认为是最佳做法?
【问题讨论】:
您可以完全使用 typeorm 来保存所有必需的数据,但请确保您创建的实体之间具有正确的连接:
// 促销.ts
@Index()
@OneToOne(() => User, user => user.promo)
@JoinColumn()
user: User
我已将@JoinColumn 添加到 Promo 中,期待 Promo 实体在表中包含 userId。
// 用户.ts
@OneToOne(() => Promo, promo => promo.user)
promo: Promo
例如,在 Repository 中,您可以使用 Transaction 操作并保存用户,并在保存此用户后立即使用其他所需的促销详细信息:
saveUser(user: User) {
return getManager().transaction(async (manager) => {
const result = await manager
.getRepository(User)
.createQueryBuilder()
.insert()
.values(user)
.execute()
// check on result emptiness
const createdUser = await manager
.getRepository(User)
.createQueryBuilder()
.where('id=:id',{id: result.identifiers[0].id})
.getOne()
await manager
.getRepository(Promo)
.createQueryBuilder()
.insert()
.values({user: createdUser})
.execute()
})
}
它将在第一个用户和与该用户的促销之后保存在一个交易中。
【讨论】: