首页 > 解决方案 > TypeORM:关系渴望树实体

问题描述

我有一个这样的树实体:

@Entity('structures')
@Tree('closure-table')
export class StructureEntity extends AbstractEntity<StructureDto> {
  @Column()
  name: string;

  @TreeParent({ onDelete: 'CASCADE' })
  parent: StructureEntity;

  @TreeChildren()
  children: StructureEntity[];

  // Eager option for enable eager loading
  @ManyToOne(
    () => OrganizationEntity,
    (organization) => organization.structures, { eager: true },
  )
  organization: OrganizationEntity;

  dtoClass = StructureDto;
}

我使用@Tree带有'closure-table'类型的装饰器,它允许我拥有像父母和孩子一样的树关系。

我这样得到树:

const structures = await this.structuresRepository.findTrees();

我必须使用findTrees()没有任何查询构建器的方法来获取数据库中的所有树及其所有孩子、孩子的孩子等。

我的问题是,除了我的表中的父子关系之外,我还有与组织实体的多对一关系。它工作正常,我可以将所有关系的数据写入数据库,但是当我获取数据时,我错过了组织属性:

{
        "id": 1,
        "createdAt": "2021-06-11T13:17:16.000Z",
        "updatedAt": "2021-06-11T13:17:54.552Z",
        "name": "Parent",
        "children": [
            {
                "id": 2,
                "createdAt": "2021-06-11T13:54:53.774Z",
                "updatedAt": "2021-06-11T13:59:40.997Z",
                "name": "Child",
                "children": []
            }
        ]
}

组织实体:

@Entity({ name: 'organizations' })
export class OrganizationEntity extends AbstractEntity<OrganizationDto> {
  @Column()
  name: string;

  @OneToMany(() => StructureEntity, (structure) => structure.organization)
  structures: StructureEntity[];

  dtoClass = OrganizationDto;
}

我怀疑这是一个 TypeORM 松弛,因为我不能使用预先加载来使用我的实体中的树关系从另一个表中获取数据。有没有使用树结构获取所有实体数据的选项?

标签: node.jstreenestjstypeorm

解决方案


我只在物化路径类型的树实体上进行了测试,并且具有多对多关系。在这种情况下,这样做解决了问题:

await getManager().getTreeRepository(StructureEntity).findTrees({ relations: ["organization"] });

推荐阅读