![](/img/trans.png)
[英]TypeORM: most efficient way to create / update / remove multiple ManyToOne relations?
[英]TypeORM - Create user with relations
当新用户注册时,我想创建一些要自动设置的关系。 目前,我正在这样做:
const user = await User.create({
email,
password: hashedPassword,
}).save();
const settings = await Settings.create({
userId: user.id,
}).save();
const settings = await Profile.create({
userId: user.id,
}).save();
根据我的阅读,事务是处理依赖操作的最佳方式,但 PG 在保存之前不会创建用户 ID。
这是我能想到的最好的交易:
const user = await User.create({
email,
password: hashedPassword,
}).save();
const settings = await Settings.create({
userId: user.id,
});
const profile = await Profile.create({
userId: user.id,
});
await getConnection().transaction(async (transactionalEntityManager) => {
await transactionalEntityManager.save(settings);
await transactionalEntityManager.save(profile);
});
但是,仍然存在用户保存的可能性,但关系没有。
有没有更好(或更简单的方法)来处理这个问题?
用户实体.ts
@Entity()
export class User {
@PrimaryGeneratedColumn()
id!: number;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
@Column({ unique: true })
email!: string;
@Column()
password!: string;
@OneToOne(() => Settings, (settings) => settings.user)
settings: Settings;
@OneToOne(() => Profile, (profile) => profile.user)
profile: Profile;
}
settings.entity.ts
@Entity()
export class Settings {
@PrimaryColumn()
userId: number;
@OneToOne(() => User, (user) => user.settings)
user: User;
}
profile.entity.ts
@Entity()
export class Profile {
@PrimaryColumn()
userId: number;
@OneToOne(() => User, (user) => user.profile)
user: User;
}
save
方法在INSERT
之前加载关系,因此无法执行save
settings
,生成的查询将首先尝试SELECT
user
,然后才INSERT
settings
,正如您所说 - 在事务中不可能 select 未提交记录,这就是为什么它不起作用。
可以做什么? 两种选择:
const user = await getConnection()
.transaction((transactionalEntityManager) => {
const userObj = User.create({
email,
password: hashedPassword,
})
userObj.profile = Profile.create({});
userObj.settings = Settings.create({});
return transactionalEntityManager.save(User, userObj);
});
settings
和profile
const userInsertResult = await getConnection()
.transaction(async (transactionalEntityManager) => {
const userInsertResult = await transactionalEntityManager
.createQueryBuilder(User,'user')
.insert()
.into(User)
.values({
email,
password: hashedPassword
}).execute();
const settingsInsertResult = await transactionalEntityManager
.createQueryBuilder(Settings,'settings')
.insert()
.into(Settings)
.values({
userId: userInsertResult.raw.id
}).execute();
const profileInsertResult = await transactionalEntityManager
.createQueryBuilder(Profile,'profile')
.insert()
.into(Profile)
.values({
userId: userInsertResult.raw.id
}).execute();
return userInsertResult
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.