#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()