Согласно spec , документ GraphQL может содержать любое количество операций , где операция является одной из query
, mutation
или subscription
.
- запрос - выборка только для чтения.
- мутация - запись с последующей выборкой.
- подписка - долгоживущий запрос, который извлекает данные в ответ на исходные события.
Только одна операция может быть выполнена для конкретного запроса (если предоставляется более одного, необходимо указать operationName
, чтобы указать, какой из них должен быть выполнен).
Однако в рамках этой операции может быть запрошено любое количество полей. Таким образом, если вам нужно два или более полей запроса корневого уровня (в разговорной речи называемые «запросы»), они могут быть объединены в одну операцию:
query ArbitraryOperationName {
getSomething
getSomethingElse
}
То же самое для мутаций - вы можете выполнить две или более мутации (последовательно):
mutation ArbitraryOperationName {
doSomething
doSomethingElse
doAThirdAction
}
Таким образом, единственные сценарии, в которых вам нужно разделить ваш запрос на несколько запросов:
- Вам необходимо выполнить и
query
, и mutation
- это отдельные операции, поэтому их нужно отправлять отдельно.
- Вам необходимо предоставить часть результата одного запроса в качестве входного для другого.
Вы должны иметь возможность получить и идентификатор метки, и идентификатор проблемы в одном запросе:
query {
repository(owner: "graphql", name: "graphql-js") {
label(name: "help wanted") {
id
}
issue(number: 100) {
id
}
}
}
Однако ваша мутация должна быть отдельным запросом, потому что 1) это другая операция и 2) она требует в качестве входных данных, возвращаемых вышеуказанным запросом.
Тем не менее, тот факт, что addlabelstolabelable
требует, чтобы вы передавали идентификаторы вместо имен для меток и идентификаторы вместо номеров для выпусков / PR, это выбор дизайна со стороны Github. Хотя довольно часто можно видеть объекты, на которые явно ссылается какое-то поле id в аргументах мутации, в спецификации нет ничего, что запрещало бы мутации принимать другие идентификаторы в качестве входных данных.