Używanie dyrektyw wielo-polowych
Dyrektywa wielo-polowa to dyrektywa, która może być stosowana do wielu pól jednocześnie, zamiast tylko do jednego. Po włączeniu, do wszystkich dyrektyw dodawany jest argument affectAdditionalFieldsUnderPos, w którym można określić względne pozycje dodatkowych pól, do których dyrektywa ma zostać zastosowana.
Na przykład w poniższym query dyrektywa @strTranslate jest stosowana tylko do pola content:
{
posts {
excerpt
content @strTranslate
}
}Dyrektywę @strTranslate można również zastosować do pola excerpt, dodając argument dyrektywy affectAdditionalFieldsUnderPos z wartością [1] (ponieważ 1 to względna pozycja pola excerpt względem dyrektywy @strTranslate):
{
posts {
excerpt
content
@strTranslate(
affectAdditionalFieldsUnderPos: [1]
)
}
}Liczba dodawanych pól nie jest ograniczona. W tym query tłumaczony jest również dateStr:
{
posts {
dateStr
excerpt
content
@strTranslate(
affectAdditionalFieldsUnderPos: [1, 2]
)
}
}Pole, do którego dyrektywa jest naturalnie stosowana (np. content we wszystkich powyższych queries) nie powinno być podawane w argumencie.
W powyższym query względne pozycje od dyrektywy @strTranslate do poprzednich pól wynoszą:
- Pozycja
2:dateStr - Pozycja
1:excerpt - Pozycja
0:content<= Jest niejawna, zawsze stosowana
Przypadki użycia
Istnieją dwa główne przypadki użycia tej funkcji:
- Wydajność
- Rozszerzona funkcjonalność
Wydajność
W przypadku dyrektyw wykonujących wywołania do zewnętrznych API, im mniejsza liczba żądań, tym szybciej zostaną one rozwiązane.
Tak jest w przypadku dyrektywy @strTranslate, która łączy się z API Google Translate. Normalnie, aby przetłumaczyć pola content i excerpt z listy postów, query wyglądałoby tak:
query {
posts {
excerpt @strTranslate
content @strTranslate
}
}Dodając @strTranslate dwukrotnie, to query wykonuje dwa żądania do API Google Translate (jedno do przetłumaczenia wszystkich wartości excerpt, drugie do wszystkich wartości content).
Dzięki funkcji Multi-Field Directives, poniższe query również tłumaczy wszystkie wartości dla obu pól content i excerpt, ale wykonuje tylko jedno żądanie do API Google Translate:
query {
posts {
excerpt
content
@strTranslate(
affectAdditionalFieldsUnderPos: [1]
)
}
}Rozszerzona funkcjonalność
Dyrektywy otrzymujące dodatkowe pola mogą wykonywać dodatkowe obliczenia.
Na przykład dyrektywa @export normalnie eksportuje wartość jednego pola, np. imię zalogowanego użytkownika:
query GetLoggedInUserName {
me {
name @export(as: "userName")
}
}Za pomocą argumentu affectAdditionalFieldsUnderPos, @export może otrzymać wiele pól i wyeksportuje wtedy słownik zawierający te pola jako wpisy:
query GetLoggedInUserNameAndSurname {
me {
name
surname
@export(
as: "userProps"
affectAdditionalFieldsUnderPos: [1]
)
}
}@export wyprodukuje teraz następującą wartość w zmiennej $userProps
{
"name": "Leo",
"surname": "Loso"
}Konfiguracja
Aby włączyć lub wyłączyć dyrektywy wielo-polowe w schemacie GraphQL, przejdź do modułu "Multi-Field Directives" na stronie Ustawień i zaznacz/odznacz pole wyboru Enable multi-field directives?:

Aby włączyć lub wyłączyć dyrektywy wielo-polowe dla konkretnego endpointu, wybierz żądaną opcję w bloku "Multi-Field Directives" z odpowiedniej Konfiguracji Schematu:
