GraphQL数据建模 - 扩展类型(Prisma)

问题描述 投票:0回答:1

在我的Prisma数据模型中,我开始使用基本的用户类型,如下所示:

type User {
  name: String!
  email: String! @unique
  password: String!
}

现在,用户可以有两个角色:作为候选人或与雇主相关联的用户。如果是候选人,则用户还应具有一组申请和一组资格,如果与雇主相关联,则应具有访问级别和对雇主的引用。

首先,有没有办法在GraphQL数据建模中扩展基本类型?如果是这样,我该怎么做呢?

如果没有,我可以看到使用三种不同的方法,我很好奇每种方法的优缺点是什么:

  1. 有两种不同的类型CandidateUserEmployerUser,每个都有nameemailpassword。我看到这种方法存在两个问题:@unique上的email标签不可靠,我必须编写自定义验证以确保该字段在两种类型中都是唯一的;并且使用单个登录功能来接收电子邮件并获取用户相应的数据不再是微不足道的:它需要在两个表中进行查找。

像这样:

    type CandidateUser {
      name: String!
      email: String! @unique
      password: String!
      applications: [Application!]!
      qualifications: [Qualification!]!
    }
    type EmployerUser{
      name: String!
      email: String! @unique
      password: String!
      employer: Employer!
      accessRight: AccessRight!
    }
  1. 再两个单独的类型,但有一个RootUser包含nameemailpassword,以及CandidateUserEmployerUser每个都与RootUser一对一的引用。这将在电子邮件字段上强制执行@unique标记,但查找仍然是非常重要的。 type RootUser{ name: String! email: String! @unique password: String! } type CandidateUser { rootUser: RootUser! applications: [Application!]! qualifications: [Qualification!]! } type EmployerUser{ rootUser: RootUser! employer: Employer! accessRight: AccessRight! }
  2. 扩展User以使EmployerUser和CandidateUser中的字段成为可选参数。这是一个非常简单的方法,但我需要自定义处理来强制执行需求字段(因为,我不能根据需要标记雇主,因为候选人不存在该字段)。 type User{ name: String! email: String! @unique password: String! applications: [Application!]! qualifications: [Qualification!]! employer: Employer accessRight: AccessRight }

我真的想问一下是否有更好的解决方法。我仍然是GraphQL的新手,并不是最好的数据建模者,但我会大大调整正确方向的任何推动:)

如果我没有其他选择,只有我列出的三个,哪一个最有意义?

graphql data-modeling prisma-graphql
1个回答
2
投票

你要做的是实现一个interface type

接口是一种抽象类型,它包含一组字段,类型必须包含这些字段才能实现接口。

interface User {
  name: String!
  email: String! @unique
  password: String!
}

这意味着任何实现User的类型都需要具有这些确切的字段,以及这些参数和返回类型。所以现在你的Candidate类型可以实现User

type Candidate implements User {
  name: String!
  email: String! @unique
  password: String!
  applications: [Application!]!
  qualifications: [Qualification!]!
}

当您想要返回一个对象或一组对象时,接口很有用,但这些对象可能有几种不同的类型。有关更多信息,请查看interface abstract type documentation


更新:

由于这是一个Prisma GraphQL问题,您应该知道Prisma目前还不支持接口或联盟类型。 Issue #83issue #165分别讨论了两个特征请求。

但是,有一篇很棒的文章讨论了这种方法的解决方法:

GraphQL Interfaces (and Union Types) with Prisma and Yoga

归结为2个选项:

  1. 使用Prisma中的一种类型(接口)下的可选类型特定字段存储所有数据,然后在应用服务器中的基元类型之间分割数据。
  2. 在Prisma上存储每种基元类型的数据,并在应用服务器上拼接查询。
© www.soinside.com 2019 - 2024. All rights reserved.