TypeORM:通过存储库更新具有关系(@joinColumn)的实体列

Ale*_*Dim 5 postgresql node.js typescript typeorm nestjs

我有以下实体:

@Entity({ name: 'user' })
export class UserEntity extends BasicEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({
    nullable: false,
    unique: true,
  })
  login: string;
}
Run Code Online (Sandbox Code Playgroud)
@Entity({ name: 'wallet' })
export class WalletEntity extends BasicEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @ManyToOne(() => UserEntity)
  @JoinColumn({ name: 'user_id' })
  user: UserEntity;

  @Column({
    name: 'address',
    type: 'text',
  })
  address: string;
}
Run Code Online (Sandbox Code Playgroud)

所以,钱包表看起来像这样:

-------------------------
 id | user_id | address
-------------------------
 1  |    1    |   0x12   
-------------------------
 2  |    43    |  0x10   
Run Code Online (Sandbox Code Playgroud)

我喜欢通过 Repository api 更新wallet实体。但问题是,我不能只是:

WalletRepository.save({ address: '0x12', userId: 2 })
Run Code Online (Sandbox Code Playgroud)

因为 Typescript 给了我一个错误,userId应该是userEntity,而不是数字。但我想更新一个关系列。那么有没有更新的选项呢?

Ale*_*Dim 7

我找到了答案,不是在 TypeORM 文档中,而是在 Github post 中

所以我需要两列:

@Entity({ name: 'wallet' })
export class WalletEntity extends BasicEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @ManyToOne(() => UserEntity, (entity: UserEntity) => entity.id)
  @JoinColumn({ name: 'user_id' })
  user: UserEntity;

  @Column({ name: 'user_id', type: 'int' })
  userId: number;

  @Column({
    name: 'address',
    type: 'text',
  })
  address: string;
}
Run Code Online (Sandbox Code Playgroud)

一个用于{name: user_id}关系,另一个用于关系更新或查找值。这相当不明显。因此,如果您想通过此关系 ID 搜索值,您可以通过userID实体的属性来完成。但是当您使用 进行join部分操作时relations[],您可以按字段访问对象user