Search code examples
typescripttypeorm

TypeORM how to OneToOneToOne?


typeorm define:

@Entity({ name: 'person' })
export class Person extends BaseEntity {
  @PrimaryColumn({ type: 'varchar' })
  key!: string;

  @OneToOne(() => PersonMeta, { cascade: true })
  @JoinColumn({ name: 'key', referencedColumnName: 'key', foreignKeyConstraintName: 'metaKey' })
  meta!: MetaDB;
}

@Entity({ name: 'personMeta' })
export class PersonMeta extends BaseEntity {
  @PrimaryColumn({ type: 'varchar' })
  key!: string;
  
  @Column()
  @Index()
  age!: number;
}

@Entity({ name: 'house' })
export class House extends BaseEntity {
  @PrimaryColumn({ type: 'varchar' })
  key!: string;
  
  @OneToOne(() => Person, { cascade: true })
  @JoinColumn({ name: 'owner', referencedColumnName: 'key', foreignKeyConstraintName: 'ownerKey' })
  owner!: FNodeDB;
}

and how to query one house's owner with his personMeta ?

const owner = Person.findOneBy({ key: 'xxx', name: 'eczn' });
if (!owner) throw new Error('not found');

const house = await House.findOne({
  relation: { owner: true },
  // relation: { owner: true, meta: true }, runtime error if adding 'meta:true'
  where: { owner },
});

console.log('house owner age is:', house.owner.meta.age);
// but it will throw error: house.owner.meta is undefined

how to OneToOneToOne ?


Solution

  • found an usage of relation field and works:

    const house = await House.findOne({
      relation: ['owner', 'owner.meta'],
      where: { owner },
    });
    console.log(house.owner.meta); // works