雀巢公司+;打字形式+;Graphql:嵌套关系中DTO的正确设计模式
假设我有一个类型化实体定义,如下所示:雀巢公司+;打字形式+;Graphql:嵌套关系中DTO的正确设计模式,graphql,nestjs,typeorm,Graphql,Nestjs,Typeorm,假设我有一个类型化实体定义,如下所示: @Entity() 导出类MyEntity{ @PrimaryGeneratedColumn() id:编号; @列('varchar',{length:500}) 名称:字符串; ... @OneToOne(类型=>DocumentEntity) @JoinColumn() myDoc:DocumentEntity; @OneToMany(类型=>DocumentEntity,文档=>document.myEntity) @JoinColumn() 其他
@Entity()
导出类MyEntity{
@PrimaryGeneratedColumn()
id:编号;
@列('varchar',{length:500})
名称:字符串;
...
@OneToOne(类型=>DocumentEntity)
@JoinColumn()
myDoc:DocumentEntity;
@OneToMany(类型=>DocumentEntity,文档=>document.myEntity)
@JoinColumn()
其他单据:DocumentEntity[];
...
}
所以它有几个实体关系,OneToMany/onetomone
在制作DTO时,我该如何实现这一点
这里我有一个DTO示例:
导出类CreateMyEntityInputDto{
@IsString()
名称:字符串;
...
@等民族()
myDoc:DocumentEntity;
@等民族()
其他单据:DocumentEntity[];
....
}
我不清楚通过Graphql的最佳方法
当前graphql接口:
####################
#@输入
####################
输入CreateDealInput{
名称:String
...
myDoc:DocumentInput
其他文档:[文档输入]
}
如果我正在设计一个“传统的”RESTful服务,我会通过一个单独的端点在DB中创建文档,等待返回documentID:int
然后在myEntity.myDoc/myEntity.otherDocs
创建新的myEntity
时的字段(位于单独的端点)
我在这里采取同样的方法吗?
即我是否在graphql中的单独查询中创建文档实体,从成功响应中解析出创建的ID,然后在DTO定义中指定这些int值
比如:
@IsOptional()
myDoc:int;
然后,在创建myEntity时,在最终通过TypeForm保存之前,按id:int加载那些(现有)文档实体
还是在一个大型嵌套POST graphql查询中将所有文档字段作为嵌套实体传递,并使用cascade创建它们?我自己也遇到了同样的问题。我的解决方案是通过id引用嵌套实体。在您的示例中,这类似于:
export class CreateMyEntityInputDto {
@IsString()
name: string;
...
@IsOptional()
myDocId: string;
@IsOptional()
otherDocIds: string[];
....
}
该解决方案不需要在一个变种中创建嵌套实体,而是需要多个实体