Есть ли способ сгруппировать запросы в GraphQL?
Я пытаюсь сгруппировать запросы GraphQL, чтобы получить более организованный ответ.
Я хочу сделать запрос для всех сотрудников и получить что-то в следующем формате
GraphQL Query
{
Employees:allEmployees{
id
firstName
lastName
}
}
отклик
{
"data": {
"Employees": [
"new":[
{
"id": "1",
"firstName": "James",
"lastName": "Test"
},
{
"id": "3",
"firstName": "Charles",
"lastName": "Tes"
}
],
"updated":[
{
"id": "4",
"lastName": "Test"
},
],
"deleted":[
{
"id": "1",
},
],
}
}
}
Я рассмотрел несколько вариантов, чтобы получить именованный подзапрос (например, новый, обновленный и удаленный) с помощью псевдонимов фрагментов, но это не похоже на вещь. Я смотрел на союзы, но это не то, что я ищу.
В идеале я хотел бы запросить график как...
{
Employees:{
new: allEmployees(status:"new"){
id
firstName
lastName
}
updated: allEmployees(status:"updated"){
id
firstName
lastName
}
deleted: allEmployees(status:"deleted"){
id
}
}
но я не думаю, что это возможно, чтобы передать вложенный запрос, как это.
Есть ли способ сделать что-то подобное? Я использую graphql с ruby через gem graphql-ruby.
пожалуйста, дайте мне знать, если кому-то нужна дополнительная информация?
Спасибо
редактировать
Чтобы уточнить. У нас есть несколько объектов, которые будут следовать новому, обновленному, удаленному шаблону. Нужно попытаться получить ответ, в котором результаты вложены в родительское имя / псевдоним (Сотрудники, Пользователи)
{
"data": {
"Employees": [
"new":[...],
"updated":[...],
"deleted":[...],
],
"Users": [
"new":[...],
"updated":[...],
"deleted":[...],
],
...
}
Вот почему мы хотели бы гнездиться
2 ответа
GraphQL определенно поддерживает вложенные запросы и множественные запросы верхнего уровня, а graphql-ruby прекрасно их поддерживает.
Если ваша схема GraphQL выглядит так:
type Employee {
id: ID!
firstName: String
lastName: String
}
enum Status { NEW, UPDATED, DELETED }
type Query {
allEmployees(status: Status): [Employee!]!
}
тогда вы могли бы написать запрос
fragment EmployeeData on Employee { id firstName lastName }
query Everyone {
new: allEmployees(status: NEW) { ... EmployeeData }
updated: allEmployees(status: UPDATED) { ... EmployeeData }
deleted: allEmployees(status: DELETED) { ... EmployeeData }
}
Это не будет иметь конкретной формы, которую вы ищете - нет хороших способов добавить или удалить произвольные уровни в вашем запросе, такие как добавление метки "Сотрудники" или удаление слоев из записей подключения в стиле React - но это может получить данные, которые вы ищете.
Я думаю, что ваши ожидания в отношении ответа очень вдохновлены использованием рубина. Я видел это ранее в некоторых проектах;) "Давайте упакуем все в один запрос, это оптимально" и "распределим данные ответов по компонентам".
Разработчики Ruby часто воспринимают реакцию как еще один движок шаблонов, они отказываются от его собственной, отдельной жизни, не разделяют проблем, не несут ответственности за клиентское приложение. Один маршрут, одно представление, простое взаимодействие, нет истинного SPA ... и, наконец, плохой UX/ юзабилити. Они слепы к этому:D
Клиент Apollo будет пакетировать отдельные запросы, будет хранить ответы в нормализованном кэше - нет необходимости делать это на бэкэнде.