GraphQL / Prisma 中的相同类型关系

Posted

技术标签:

【中文标题】GraphQL / Prisma 中的相同类型关系【英文标题】:Same type relationships in GraphQL / Prisma 【发布时间】:2019-12-19 04:30:59 【问题描述】:

我正在尝试创建相同类型的一对多关系。在这种情况下,一个用户可以向一个用户报告,然后有许多用户向他们报告。

我的数据模型目前如下所示:

type User 
  id: ID! @id
  name: String!
  email: String! @unique
  reportsTo: User @relation(name: "UserReports")
  reports: [User] @relation(name: "UserReports")

我希望将 userId 添加到 reportsTo 应该将相应的用户 ID 添加到报告中。

但是,将 userId 添加到 reportsTo 是将 userId 添加到同一用户的报告,而不是其他用户的报告。

【问题讨论】:

【参考方案1】:

您不能与一种类型的不同元素建立关系。关系连接两种不同的类型,因此我们知道它们共享信息。因此,我们需要创建一些可以建立关系的附加类型。

我创建了两种不同的类型,一种是“监督者”,它是监督其他用户的用户,但我们将这些用户作为第二种类型,“监督者”。每个用户既可以是主管,也可以是被监督者。用户与这两种类型中的每一种之间存在关系,并且这两种类型之间也存在关系。

这是数据模型:

type User 
  id: ID! @id
  name: String!
  email: String! @unique
  supervisor: Supervisor @relation(name: "UserToSupervisor")
  supervisee: Supervisee @relation(name: "UserToSupervisee")


type Supervisor 
  id: ID! @id
  user: User! @relation(name: "UserToSupervisor")
  supervisees: [Supervisee!]! @relation(name: "SupervisorToSupervisee")


type Supervisee 
  id: ID! @id
  user: User! @relation(name: "UserToSupervisee")
  supervisor: Supervisor! @relation(name: "SupervisorToSupervisee")

您必须查看用户中的“主管”字段,而不是查看该用户的主管是谁,而是该用户自己可能是主管。这也是被监督者的情况。基本上supervisor和supervise都是user的扩展,它们之间的工作关系是在这两种类型之间定义的。

【讨论】:

以上是关于GraphQL / Prisma 中的相同类型关系的主要内容,如果未能解决你的问题,请参考以下文章

Prisma、GraphQL 和 Apollo 中具有突变的数据关系和连接类型

使用 GraphQL 和 Prisma 级联删除相关节点

如何在两个字段 prisma-graphql 中使用相同的生成 ID

从 prisma 生成的客户端访问 graphql 服务器中的数据类型

为啥在使用 Prisma 时需要使用 GraphQL 关系?

prisma 可以实现与 graphql 相同的功能吗?