Как выбрать данные с помощью typeorm из 3 таблиц, которые зависят друг от друга?

#postgresql #nestjs #typeorm

Вопрос:

У меня есть 3 объекта, которые зависят друг от друга, и у меня проблема с запросом данных из них с помощью одного запроса.

Сначала один пользователь:

 @Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  firstName: string;

  @Column()
  lastName: string;

  @Column()
  login: string;

  @Column()
  password: string;

  @Column()
  ownerId: number;

  @OneToOne(() => Role, (role) => role.user)
  @JoinColumn()
  role?: Role;
}
 

Вторая роль:

 @Entity()
export class Role extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  description: string;

  @ManyToOne(() => User, (user) => user.role)
  @JoinColumn()
  user: User | null;

  @ManyToMany(() => Permission, { cascade: true })
  @JoinTable({ name: 'roles_has_permissions' })
  permissions: Permission[];
}
 

Третье разрешение:

 @Entity()
export class Permission {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: PossiblePermissions;
}
 

Как выбрать данные из базы данных. Я использую typeorm с Postgresql, и я хочу получить такой массив.

 [{
 …user info by ownerId
 role: {
  …role which related this user
  permissions: [{
   …permissions which related this role
  }, …]
 }
}, …]
 

Ответ №1:

Используйте конструктор запросов https://typeorm.io/#/select-query-builder

В вашем случае это должно быть что-то вроде этого:

 await connection
    .getRepository(User)
    .createQueryBuilder("user")
    .leftJoinAndSelect("user.role", "role")
    .leftJoinAndSelect("role.permissions", "permissions")
    .getMany()