如何对 typeorm 关系进行递归

Roa*_*ach 5 node.js typescript typeorm nestjs

类别.ts

@Entity('categoryenter code here')
export class Category{
  @PrimaryGeneratedColumn({ type: 'int' })
  id: Category;

  @OneToMany(() => Category, category => category.category,{eager:true})
  categoryList: Category[];

  @ManyToOne(() => Category, (category) => category.categoryList)
  category: Category;
}
Run Code Online (Sandbox Code Playgroud)

类别实体在上面(mysql)。我想找到一个包含所有这样子项的类别

await categoryRepo.findOne({
  where:{ id: 1 },
  relations:['categoryList']
})
Run Code Online (Sandbox Code Playgroud)

但我得到了一个错误Maximum call stack size exceeded

我该怎么办

小智 15

实际上,正如我所见,您正在尝试创建一个树形数据结构。TypeORM 有一些用于此目的的装饰器。这是一个例子:

import {
  Entity, BaseEntity, Column,
  PrimaryGeneratedColumn, Tree,
  TreeParent, TreeChildren
} from 'typeorm';

@Tree('materialized-path')
@Entity({ name: 'Menu' })
export class Category extends BaseEntity {
  @PrimaryGeneratedColumn({ type: 'int' })
  id: number;

  @Column({ type: 'varchar', length: 50 })
  text: string;

  // Check bellow
  @TreeParent()
  parent: Category;

  @TreeChildren()
  children: Category[];
}
Run Code Online (Sandbox Code Playgroud)

装饰器@Tree()用于告诉 TypeORM 每个实例都有自己的自引用。每个项目都应该有一个父项,并且应该有多个子项。祖先和后代可以分别用装饰器@TreeParent()和来设置@TreeChildren()。有关装饰器可用的不同模式的更多详细信息,请查看文档@Tree()


Era*_*han 2

由于您已经eager加载,每个Category对象都尝试加载其所有符合categoryList. 由于categoryList它也是一个Category实体列表,因此它的所有子项也都在尝试加载categoryList自己的实体。这样一直持续下去,直到堆栈溢出。

从实体中删除eager加载Category

@Entity('categoryenter code here')
export class Category{
  @PrimaryGeneratedColumn({ type: 'int' })
  id: Category;

  @OneToMany(() => Category, category => category.category)
  categoryList: Category[];

  @ManyToOne(() => Category, (category) => category.categoryList)
  category: Category;
}
Run Code Online (Sandbox Code Playgroud)