如何使用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[];
}

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. 如果搜索条件适用于每个表中的不同列名,我如何实现?

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

我认为我可以为每种类型做单独的查询,并将它们全部合并。关键是要限制搜索范围。

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

相关内容

  • 没有找到相关文章

最新更新