postgresql Typeorm -将SQL左连接一对一关系转换为typeorm查询生成器

9rygscc1  于 2022-12-03  发布在  PostgreSQL
关注(0)|答案(1)|浏览(250)

我在postgresql数据库中使用Typeorm创建了以下实体:

@Entity('issuer')
export class Issuer {
  @PrimaryColumn()
  issuer_id: string

  @OneToOne(() => UserData, { cascade: true })
  @JoinColumn({ name: 'issuer_id', referencedColumnName: 'public_address' })
  u_data: UserData

  @BeforeInsert()
  newid() {
    this.issuer_id = this.u_data.public_address
  }
  
  ...remaining columns...
}

@Entity('user_data')
export class UserData {
  @PrimaryColumn({ type: 'varchar', unique: true })
  email: string

  @Column({ type: 'varchar', nullable: false, unique: true })
  public_address: string

  ...remaining columns...
}

在上面的Issuer实体中,我使用了一个小技巧,可以创建一个主键和外键,即issuer_id列,它是Issuer的主键,而UserData的外键引用UserData的public_address列。我想联接这两个实体,我可以使用以下查询来实现:

SELECT *
FROM user_data
LEFT OUTER JOIN issuer ON issuer.issuer_id = user_data.public_address
WHERE user_data.email = $1

我无法将这个简单的SQL代码转换成Typeorm查询生成器。以下是我失败的尝试:

await this.userRepository
  .createQueryBuilder('user')
  .leftJoin('user.public_address', 'issuer')
  .where('user.email = :email', { email })
  .getOne()

下面是我得到的错误:

TypeORMError: Relation with property path public_address in entity was not found.
yqyhoc1h

yqyhoc1h1#

当试图从一个与其亲属没有直接关系的实体进行左连接(typeorm上不存在右连接)时,leftJoinAndSelect函数应该与一个条件一起使用:

return await this.userRepo
        .createQueryBuilder('user')
        .leftJoinAndSelect(Issuer, 'issuer', 'user.public_address = issuer.issuer_id')
        .where('user.email = :email', { email })
        .getRawOne()

相关问题