繁体   English   中英

如何使用 TypeORM 搜索具有多种类型的树结构

[英]How to search tree structure with multiple types with TypeORM

感谢阅读并提供任何建议或任何关键字我可以做更多的研究。

对 TypeORM 很陌生,在使用 TypeORM 搜索树结构时遇到问题。

树结构是典型的树结构,但是通过使用不同的模式(闭包表和邻接表),它可能具有不同的节点类型(实体类型/表),这使得它更加复杂。

假设它是一个公司层次结构树,包含公司,部门和团队,每个节点类型可以是不同的实体(数据库表),并通过闭包表链接到其具有相同类型但具有不同子节点的父子节点通过使用邻接表。 例如,Company 实体通过使用闭包表链接到 parentCompany 和 childCompany,但通过使用邻接表链接到其部门:

import {Entity, Tree, Column, PrimaryGeneratedColumn, TreeChildren, TreeParent, TreeLevelColumn} from "typeorm";

@Entity()
@Tree("closure-table")
export class Company {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @TreeChildren()
    children: Company[];

    @TreeParent()
    parent: Company;

    @OneToMany(() => Department, (entity) => entity.company)
    @IsInstance(Department, { each: true })
    public departments: Department[];
}

部门类似:

import {Entity, Tree, Column, PrimaryGeneratedColumn, TreeChildren, TreeParent, TreeLevelColumn} from "typeorm";

@Entity()
@Tree("closure-table")
export class Department {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @ManyToOne(() => Company, (entity) => entity.departments)
    @JoinColumn({ name: "company_id" })
    @IsInstance(Company)
    @IsOptional()
    public company?: Company;

    @TreeChildren()
    children: Department[];

    @TreeParent()
    parent: Department;

    @OneToMany(() => Team, (entity) => entity.team)
    @IsInstance(Team, { each: true })
    public teams: Team[];
}

和团队:

import {Entity, Tree, Column, PrimaryGeneratedColumn, TreeChildren, TreeParent, TreeLevelColumn} from "typeorm";

@Entity()
@Tree("closure-table")
export class Team {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @ManyToOne(() => Department, (entity) => entity.teams)
    @JoinColumn({ name: "department_id" })
    @IsInstance(Department)
    @IsOptional()
    public department?: Department;

    @TreeChildren()
    children: Team[];

    @TreeParent()
    parent: Team;
}

我打算从所有树节点中按名称进行搜索。 做了一些研究和调查,我知道 TypeORM 树存储库提供了 createDescendantsQueryBuilder 能够这样做:

const children = await repository
    .createDescendantsQueryBuilder("company", "companyClosure", parentCompany)
    .andWhere("company.name like '%stackoverflow%'")
    .getMany();

但看起来只能从关闭表中检索公司,不能检索子部门和团队。 我的问题是:

  1. 树存储库是否能够使用 createDescendantsQueryBuilder 示例检索所有节点类型?
  2. 如果不支持,我认为必须自己满足业务逻辑,那么也必须自己提供分页?
  3. 如果搜索条件适用于每个表中的不同列名,我该如何实现?

做了一些研究和调查,从闭包表中可以很容易地检索到节点的后代。

我想我可以对每种类型进行单独查询并将它们全部合并。 关键点是限制搜索范围。

我可以获得种子部门,并借助闭包表,可以检索所有相关部门并进行搜索。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM