Puedes autorreferenciar tus relaciones. Aquí hay un ejemplo de un gráfico dirigido simple (también conocido como un nodo puede tener un padre y varios hijos).
@Entity()
export class Service extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
@Index({ unique: true })
title: string;
@ManyToOne(type => Service, service => service.children)
parent: Service;
@OneToMany(type => Service, service => service.parent)
children: Service[];
}
Una nota importante a tener en cuenta es que estas relaciones no se cargan automáticamente al leer un objeto de la base de datos con find*
funciones.
Para cargarlos realmente, debe usar el generador de consultas en este momento y unirse a ellos. (Puede unirse a varios niveles). Un ejemplo:
let allServices = await this.repository.createQueryBuilder('category')
.andWhere('category.price IS NULL')
.innerJoinAndSelect('category.children', 'product')
.leftJoinAndSelect('product.children', 'addon')
.getMany();
Tenga en cuenta cómo utilicé diferentes nombres para hacer referencia a ellos (category
, product
y addon
).