TypeORM-创建具有关系的用户

埃莉·G

当新用户注册时,我想创建一些关系以自动进行设置。目前,我正在以这种方式进行操作:

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才创建用户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);
});

但是,仍然存在用户保存的可能性,但是关系没有保存。

有没有更好(或更简单的方法)来解决这个问题?

用户实体

@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;
}

个人资料

@Entity()
export class Profile {
  @PrimaryColumn()
  userId: number;

  @OneToOne(() => User, (user) => user.profile)
  user: User;
}
诺姆·斯坦纳

save关系的方法之前加载INSERT,因此它是无法进行savesettings,生成的查询将首先尝试SELECTuser,然后才INSERT settings像你说的-一个事务中,不可能选择未提交的记录,那为什么它不”工作。

该怎么办?两种选择:

  1. 保存嵌套的实体
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);
});
  1. 插入用户,然后插入settingsprofile
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
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Typeorm如何获得关系

来自分类Dev

如何过滤关系-TypeORM

来自分类Dev

TypeORM:创建BaseRepository类

来自分类Dev

TypeORM:在迁移中定义关系

来自分类Dev

Typeorm关系-按ID保存

来自分类Dev

TypeORM,ManyToOne关系:获取没有子关系的父母行

来自分类Dev

在typeorm中创建关系的正确方法是什么?

来自分类Dev

我如何测试具有本地依赖关系的TypeORM存储库方法

来自分类Dev

TypeORM关系:仅ID而不是整个实例

来自分类Dev

TypeORM-搜索并填充多对多关系

来自分类Dev

Typeorm嵌套关系用于自引用实体

来自分类Dev

TypeORM 单向多对一关系

来自分类Dev

TypeORM:创建/更新/删除多个ManyToOne关系的最有效方法?

来自分类Dev

使用TypeORM选择有限数量的关系(OneToMany)

来自分类Dev

TypeORM日志记录-启用但没有输出

来自分类Dev

用ORM(TypeORM)设计三维关系

来自分类Dev

TypeORM获得多对多关系的一面

来自分类Dev

Typeorm-左联接并仅选择关系实体

来自分类Dev

Typeorm在关系的另一端找到

来自分类Dev

获得具有关系的登录用户

来自分类Dev

如何返回新创建的实体以及与Nest.js / TypeORM的关系?

来自分类Dev

如何在TypeORM中使用TIME类型创建实体列

来自分类Dev

TypeORM ManyToMany Juntion表创建不起作用

来自分类Dev

RubyOnRails-创建具有关系的新对象

来自分类Dev

swift 3 - 创建具有关系的条目

来自分类Dev

使用typeORM进行批量插入/更新的有效方法

来自分类Dev

TypeORM连接失败,没有任何错误消息

来自分类Dev

TypeORM @OneToMany在被调用时似乎没有尝试执行

来自分类Dev

typeorm返回字段中带有__underscores__的find函数