GraphQL 命名对象文字 typeDef
GraphQL named Object literal typeDef
我正在完成一个个人项目,我正在尝试找出定义 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
}
type Appointment {
id: ID!
user: User!
}
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
查询——或类似效果的东西):
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: "...",
}
},
...
]
},
...
]
},
...
]
}
请注意,这最终会产生与您发布的略有不同的输出。为什么?
好吧,我做出了以下设计选择,我鼓励您也研究一下:
用户应该是一个单独的字段。在您的示例中,用户和约会信息都在同一个键下 - 09:00-am
- 在这里,我们希望通过定义一个 User
类型来利用 GraphQL 的类型系统来规范化模式附上约会。也更适合内省。
您的 appointments
键指向另一个 对象 作为其值,而不是列表。由于您要在一天结束时返回约会列表,因此您应该将其建模为 GraphQL List
添加了与约会列表关联的 AppointmentTime
类型。这使您可以同时进行多个约会。 (未来证明)
每天都有一个列表 AppointmentTime
--- 这是最优的,因为您现在不再依赖密钥(在您的情况下,09:00-am
)来定义与每个约会时间关联的数据。 (未来证明)
如果您确实希望对象文字与 graphql 输出完全匹配,您可以将我选择提取的一些字段内联到其他类型,但实际上,您应该为这种事情利用列表。
我正在完成一个个人项目,我正在尝试找出定义 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
}
type Appointment {
id: ID!
user: User!
}
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
查询——或类似效果的东西):
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: "...",
}
},
...
]
},
...
]
},
...
]
}
请注意,这最终会产生与您发布的略有不同的输出。为什么?
好吧,我做出了以下设计选择,我鼓励您也研究一下:
用户应该是一个单独的字段。在您的示例中,用户和约会信息都在同一个键下 -
09:00-am
- 在这里,我们希望通过定义一个User
类型来利用 GraphQL 的类型系统来规范化模式附上约会。也更适合内省。您的
appointments
键指向另一个 对象 作为其值,而不是列表。由于您要在一天结束时返回约会列表,因此您应该将其建模为 GraphQL List添加了与约会列表关联的
AppointmentTime
类型。这使您可以同时进行多个约会。 (未来证明)每天都有一个列表
AppointmentTime
--- 这是最优的,因为您现在不再依赖密钥(在您的情况下,09:00-am
)来定义与每个约会时间关联的数据。 (未来证明)
如果您确实希望对象文字与 graphql 输出完全匹配,您可以将我选择提取的一些字段内联到其他类型,但实际上,您应该为这种事情利用列表。