GraphQL命名对象文字类型定义

GraphQL命名对象文字类型定义,graphql,prisma-graphql,Graphql,Prisma Graphql,我正在处理一个个人项目,并试图找出定义对象对象的最佳方法,这些对象在GraphQL的类型定义中如下所示 { "2020-12-29": { open: true, hours: 2, appointments: { "09:00-am": { appointmentId: "5223a4ef-a3cf-4e2f-b761-3e06193e2e21",

我正在处理一个个人项目,并试图找出定义对象对象的最佳方法,这些对象在GraphQL的类型定义中如下所示

{
    "2020-12-29": {
    open: true,
    hours: 2,
    appointments: {
        "09:00-am": {
            appointmentId: "5223a4ef-a3cf-4e2f-b761-3e06193e2e21",
            userName: "Shaun Cartwright Glover",
            email: "Maverick.Quitzon31@yahoo.com",
            phoneNumber: "1-401-519-4771",
            avatar: "https://s3.amazonaws.com/uifaces/faces/twitter/ffbel/128.jpg",
        },
    },
    totalAppointments: 1,
},

如您所见,顶级计划的对象文本的名称是日期,每个单独的约会都是这样做的。如果有帮助的话,我还将使用graphql prisma。

为了跟随您的示例,让我们将对象文字分解为它所表示的实体。在高级细节中,您将看到

  • 代表任命的实体
  • 与所述预约相关联的用户
  • 与特定约会时间关联的约会列表
  • 指定日期的预约时间列表
  • 以日程表的形式列出的日期列表
对我来说,这似乎与示例中的数据非常(但不完全)匹配。基于此,我在下面定义了一个模式,其中包含一些有意的设计决策,这些决策与您的建议略有偏差

让我们定义一些类型,并将它们组合在一起,从
User
类型开始:

type User {
  id: ID!
  name: String!
  email: String!
  # Depending on your requirements, a user may not have to provide a phone number.
  phoneNumber: String
  # Depending on your requirements, a user may not have an Avatar.
  avatarUrl: String
}
这将允许您编写如下查询(假设您有一个
getSchedule
查询——或类似效果的查询):

getSchedule {
  days {
    id
    open
    hours
    appointmentTimes {
      time
      appointments {
        id
        user {
          name
          email
          phoneNumber
          avatarUrl
        }
      }
    }
  }
}
请注意,这将最终产生与您发布的输出稍有不同的输出。为什么?

好吧,我做了以下设计选择,我也鼓励您进行调查:

  • 用户应该是一个单独的字段。在您的示例中,用户和约会信息都在同一个键下--
    09:00-am
    --这里,我们希望通过定义可以附加到约会的
    用户
    类型,利用GraphQL的类型系统来规范模式。反省也更好

  • 您的
    约会
    关键点指向另一个对象作为其值,而不是列表。由于您在一天结束时返回一个约会列表,因此应将其建模为

  • 添加了与约会列表关联的
    AppointmentTime
    类型。这允许您可能同时有多个约会。(未来证明)

  • 每天都有一个
    预约时间列表
    ——这是最佳选择,因为您现在不再依赖于按键(在您的情况下,
    09:00-am
    )来定义与每个预约时间相关的数据。(未来证明)


  • 如果您确实希望对象文字与graphql输出完全匹配,可以将我选择提取的一些字段内联到其他类型,但实际上,您应该利用列表来实现这类功能。

    感谢所有这些信息,因此,似乎最终我应该使用数组作为解决方案,而不是使用关键名称中的数据进行映射。我想最终会是这样。谢谢你的回答。是的!正是@LTFoReal
    type AppointmentTime {
      time: String!
      appointments: [Appointment!]!
    }
    
    type Day {
      # The Day ID could be the actual day itself, i.e. 2020-12-29
      id: ID!
      open: Boolean!
      hours: Int!
      appointmentTimes: AppointmentTime!
    }
    
    type Schedule {
     days: [Day!]!
    }
    
    getSchedule {
      days {
        id
        open
        hours
        appointmentTimes {
          time
          appointments {
            id
            user {
              name
              email
              phoneNumber
              avatarUrl
            }
          }
        }
      }
    }
    
    {
      days: [
        {
          id: "2020-12-29",
          open: true,
          hours: 2,
          appointmentTimes: [
            {
              time: "09:00-am",
              appointments: [
                {
                  id: "5223a4ef-a3cf-4e2f-b761-3e06193e2e21",
                  user: {
                    name: "John Smith",
                    email: "john@smith.com",
                    phoneNumber: "123...",
                    avatarUrl: "...",
                  }
                },
                ...
              ]
            },
            ...
          ]
        },
        ...
      ]
    }