当前位置: 首页 > 知识库问答 >
问题:

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

隗瑞
2023-03-14

假设我有一个类型化实体定义,如下所示:

@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/onetomone

在制作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服务,我会通过一个单独的endpoint在DB中创建文档,等待成功返回docentID: int

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

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

比如:

js prettyprint-override">@IsOptional()
myDoc: int;

然后,在创建myEntity时,通过id: int加载这些(现有的)文档实体,然后通过Typeorm?

还是在一个大的嵌套POST图形查询中将所有文档字段作为嵌套实体传递,并使用级联来创建它们?

共有1个答案

江承嗣
2023-03-14

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

export class CreateMyEntityInputDto {

  @IsString()
  name: string;

  ...

  @IsOptional()
  myDocId: string;

  @IsOptional()
  otherDocIds: string[];

  ....
}

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

 类似资料:
  • 问题内容: 我在laravel中很难建立起非常嵌套的关系。 所需的行为如下, 我通过ID选择一个事件,我想查看哪些人已订阅该事件。 现在的问题是事件和人员之间有一些表格。 这是有效的查询! 事件模型 城市模型 公司模式 人物模型 我尝试过的 和 还有很多其他可能性,我真的很坚持。在laravel中实现这种嵌套关系链接如此困难吗? 谢谢! 问题答案: 如果只想从表中选择某些字段,请使用以下命令:

  • 在之前,创建一个有依赖其他模型的模型的时候,我们需要提前把依赖的模型给建立好,这样就非常麻烦,是不是有那么一种方法,在一个 create 里面把其他的依赖模型一起新建出来呢? 这一小节就来解决这个问题。这其中有一个坑(关于命名),让我调试的头皮发麻。 Book 与 User 的 belongs 关系 1. 保存关系 来到 book.ts , 首先保存一下 this.belongsTo 的返回值,在

  • 你一定看过下面的功能(在facebook上),一个有一些评论的帖子,每个评论都有一个类似的计数器。 https://img4.hostingpics.net/pics/67853820170616003640LaravelNewsAccueil.png 在拉雷维尔,这将是类似的 帖子有很多评论 以下评论发布 类似于用户的评论 CommentLike belong评论 评论有很多类似的评论 所以,现

  • 前言:我试图在关系数据库的MVC体系结构中使用存储库模式。 我最近开始学习PHP中的TDD,我意识到我的数据库与应用程序的其余部分耦合得太紧密了。我读过关于存储库和使用IoC容器将其“注入”到我的控制器中的文章。很酷的东西。但现在有一些关于存储库设计的实际问题。请考虑以下示例。 所有这些查找方法都使用选择所有字段()方法。然而,在我的应用程序中,我总是试图限制我得到的字段的数量,因为这经常增加开销

  • 问题内容: 前言:我正在尝试在MVC体系结构和关系数据库中使用存储库模式。 我最近开始学习PHP中的TDD,并且意识到我的数据库与我的其余应用程序之间的联系太紧密了。我已经阅读了有关存储库并使用IoC容器将其“注入”到控制器中的信息。很酷的东西。但是现在有一些关于存储库设计的实际问题。考虑以下示例。 问题1:字段过多 所有这些查找方法均使用全选()方法。但是,在我的应用程序中,我总是试图限制获得的

  • 我必须给出使用Site Minder的SSO架构的建议。我们几乎没有J2EE应用程序。这些J2EE应用程序设计为在SSO提供者进行身份验证后,当http头包含信息时工作。我们一直保持应用程序SSO提供程序不可知。这意味着我们只依赖SSO提供程序的头。这在RSA作为SSO提供程序的情况下运行良好。 现在SiteMinder提出了另一种架构。请求的流动方式是 带IIS的SiteMinder- 要崩溃,