Чтобы следовать вашему примеру, давайте разобьем ваш литерал Object на сущности, которые он представляет. В деталях высокого уровня вы смотрите на
- Сущность, представляющая назначение
- Пользователь, связанный с указанным назначением
- Список встреч, связанных с определенным временем встречи
- Список AppointmentTimes для данного дня
- Список дней в виде расписания
Мне кажется, что это близко (но не совсем) соответствует данным в вашем примере. Основываясь на этом, я определил схему ниже с некоторыми преднамеренными дизайнерскими решениями, которые немного отличаются от вашего предложения.
Давайте определим несколько типов и свяжем их вместе, начиная с типа 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: "[email protected]",
phoneNumber: "123...",
avatarUrl: "...",
}
},
...
]
},
...
]
},
...
]
}
Обратите внимание, что это приведет к немного другому результату, чем тот, который вы опубликовали. Почему?
Ну, я сделал следующие варианты дизайна, и я бы посоветовал вам изучить их тоже:
Пользователь должен быть отдельным полем. В вашем примере пользователь и информация о встрече находятся под одним и тем же ключом — 09:00-am
— здесь мы хотим использовать систему типов GraphQL для нормализации схемы, определяя тип User
, который мы можем прикрепить к встрече. Также лучше для самоанализа.
Ваш ключ appointments
указывает на другой объект в качестве значения, а не на список. Поскольку вы возвращаете список встреч в конце дня, вы должны смоделировать его как Список GraphQL
Добавлен тип AppointmentTime
, связанный со списком встреч. Это позволяет потенциально иметь несколько встреч одновременно. (на будущее)
Каждый день имеет список AppointmentTime
--- это оптимально, поскольку теперь вы больше не зависите от ключа (в вашем случае 09:00-am
) для определения данных, связанных с каждым временем встречи. (на будущее)
Если вы действительно хотите, чтобы литерал объекта точно соответствовал выводу graphql, вы можете встроить некоторые из полей, которые я выбрал для извлечения, в другие типы, но на самом деле вам следует использовать списки для такого рода вещей. .
person
JosephHall
schedule
29.12.2020