NestJS + Typeorm + Graphql:嵌套关系中DTO的正确设计模式

时间:2019-06-07 02:55:09

标签: graphql nestjs typeorm

说我有一个像这样的Typeorm实体定义:

@Entity()
export class MyEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column('varchar', { length: 500 })
  name: string;

  ...

  @OneToOne(type => DocumentEntity)
  @JoinColumn()
  myDoc: DocumentEntity;

  @OneToMany(type => DocumentEntity, document => document.myEntity)
  @JoinColumn()
  otherDocs: DocumentEntity[];

  ...
}

所以它有几个实体关系,OneToMany / OneToOne

制作DTO时该如何处理?

这里有一个DTO示例:

export class CreateMyEntityInputDto {

  @IsString()
  name: string;

  ...

  @IsOptional()
  myDoc: DocumentEntity;

  @IsOptional()
  otherDocs: DocumentEntity[];

  ....
}

我不清楚通过Graphql的最佳方法

当前graphql接口:

####################
# @input
####################
input CreateDealInput {
  name: String
  ...
  myDoc: DocumentInput
  otherDocs: [DocumentInput]
} 

如果我正在设计“传统的” RESTful服务,我将通过单独的端点在数据库中创建文档,等待成功返回documentID(s):int

然后将这些ID指定为myEntity.myDoc / myEntity.otherDocs中的纯整数 创建新的myEntity时(在单独的端点处)字段。

我在这里采用相同的方法吗? ie 我是否要在graphql的单独查询中创建文档实体,从成功响应中解析出创建的ID,然后在DTO定义中指定这些int值? >

类似:

@IsOptional()
myDoc: int;

然后,当创建myEntity时,在最终通过Typeorm保存之前,通过id:int加载那些(现有的)文档实体吗?

还是我将所有文档字段作为一个嵌套实体传递给一个大的嵌套POST graphql查询,然后使用级联创建它们?

1 个答案:

答案 0 :(得分:0)

我自己也遇到了同样的问题。我的解决方案是按ID引用嵌套实体。在您的示例中,类似于:

export class CreateMyEntityInputDto {

  @IsString()
  name: string;

  ...

  @IsOptional()
  myDocId: string;

  @IsOptional()
  otherDocIds: string[];

  ....
}

此解决方案需要多个,而不是在一个突变中创建嵌套实体。