Konfigurowanie schematu
Konfigurowanie schematuUżywanie dyrektyw wielo-polowych

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:

  1. Wydajność
  2. 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?:

Ustawienia dla Multi-Field Directives
Ustawienia dla 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:

Multi-Field Directives w Konfiguracji Schematu
Multi-Field Directives w Konfiguracji Schematu