Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Entitetsrelationer gör att GraphQL-frågor kan passera relaterade entiteter, vilket möjliggör komplexa dataformer med en enda fråga. Till exempel:
{
  books {
    items {
      id
      title
      authors {
        items {
          first_name
          last_name
        }
      }
    }
  }
}
För att uppnå detta måste DAB få veta hur entiteter är relaterade via relationships avsnittet i konfigurationsfilen.
Konfiguration
Så här definierar du en relation mellan entiteter:
- Använd objektet 
relationshipsi entitetskonfigurationen. - Ange namnet 
target.entity. - Ange 
cardinalitysom"one"eller"many". - Du kan också ange 
source.fieldsochtarget.fields. - Använd 
linking.objectnär du modellerar många-till-många-relationer utan att exponera kopplingstabellen. 
CLI-exempel
dab update Book \
  --relationship authors \
  --target.entity Author \
  --cardinality many \
  --relationship.fields "id:id" \
  --linking.object "dbo.books_authors" \
  --linking.source.fields "book_id" \
  --linking.target.fields "author_id"
Konfigurationsexempel
"Book": {
  "source": "dbo.books",
  "relationships": {
    "authors": {
      "cardinality": "many",
      "target.entity": "Author",
      "source.fields": [ "id" ],
      "target.fields": [ "id" ],
      "linking.object": "dbo.books_authors",
      "linking.source.fields": [ "book_id" ],
      "linking.target.fields": [ "author_id" ]
    }
  }
}
En-till-många
- Använd kardinalitet 
"many". - Exempel: A 
Serieshar mångaBooks. - DAB kan härleda fält om det finns en extern nyckel.
 
dab update Series \
  --relationship books \
  --target.entity Book \
  --cardinality many
Många-till-en
- Använd kardinalitet 
"one". - Exempel: En 
Booktillhör enSeries. 
dab update Book \
  --relationship series \
  --target.entity Series \
  --cardinality one
Många-till-många (länkobjekt)
- Använd en kopplingstabell som inte exponeras i GraphQL.
 - Definiera länkningsfält från källa till mål via kopplingstabellen.
 
dab update Author \
  --relationship books \
  --target.entity Book \
  --cardinality many \
  --relationship.fields "id:id" \
  --linking.object "dbo.books_authors" \
  --linking.source.fields "author_id" \
  --linking.target.fields "book_id"
Många-till-många (explicit kopplingsentitet)
- Exponera kopplingstabellen som ett GraphQL-objekt.
 - Definiera relationer för alla tre entiteterna.
 
dab add BookAuthor \
  --source dbo.books_authors \
  --permissions "anonymous:*"
dab update BookAuthor \
  --relationship book \
  --target.entity Book \
  --cardinality one \
  --relationship.fields "book_id:id"
dab update BookAuthor \
  --relationship author \
  --target.entity Author \
  --cardinality one \
  --relationship.fields "author_id:id"
Ömsesidiga relationer
Om du vill tillåta navigering i båda riktningarna (till exempel från Book till Author och från Author till Book) definierar du en andra relation på målentiteten som vänder käll- och målfälten.
Exempel
dab update Author \
  --relationship books \
  --target.entity Book \
  --cardinality many \
  --relationship.fields "id:id" \
  --linking.object "dbo.books_authors" \
  --linking.source.fields "author_id" \
  --linking.target.fields "book_id"
Detta parar ihop med relationen mellan Book och Author och möjliggör symmetrisk traversering i GraphQL:
{
  authors {
    items {
      first_name
      books {
        items {
          title
        }
      }
    }
  }
}
Stöd för GraphQL
- Relaterade fält visas som kapslade objekt.
 - Kardinalitet avgör om en lista eller ett enskilt objekt returneras.
 - GraphQL-typnamn och fält matchar konfigurationsnamn.
 
Begränsningar
- Relationer kräver att entiteter finns i samma konfigurationsfil.
 - Endast enhoppsnavigering stöds.
 - Cykler och djup kapsling är inte optimerade.
 - REST stöder inte relationer (endast GraphQL).