Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Met entiteitsrelaties kunnen GraphQL-query's gerelateerde entiteiten doorlopen, waardoor complexe gegevensshapes met één query kunnen worden ingeschakeld. Voorbeeld:
{
books {
items {
id
title
authors {
items {
first_name
last_name
}
}
}
}
}
Hiervoor moet DAB worden verteld hoe entiteiten zijn gerelateerd via de relationships sectie in het configuratiebestand.
Configuratie
Een relatie tussen entiteiten definiëren:
- Gebruik het
relationshipsobject in de entiteitsconfiguratie. - Geef de
target.entitynaam op. - Instellen
cardinalityals"one"of"many". - Optioneel opgeven
source.fieldsentarget.fields. - Gebruik
linking.objectbij het modelleren van veel-op-veel-relaties zonder de koppelings tabel weer te geven.
CLI-voorbeeld
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"
Configuratievoorbeeld
"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" ]
}
}
}
Een-op-veel
- Kardinaliteit
"many"gebruiken. - Voorbeeld: A
Seriesheeft veelBooks. - DAB kan velden afleiden als er een vreemde sleutel bestaat.
dab update Series \
--relationship books \
--target.entity Book \
--cardinality many
Veel-op-een
- Kardinaliteit
"one"gebruiken. - Voorbeeld: Een
Bookbehoort tot éénSeries.
dab update Book \
--relationship series \
--target.entity Series \
--cardinality one
Veel-op-veel (object voor koppeling)
- Gebruik een koppeltabel die niet zichtbaar is in GraphQL.
- Definieer het koppelen van velden van bron naar doel via de join-tabel.
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"
Veel-op-veel (expliciete join-entiteit)
- De jointabel beschikbaar maken als een GraphQL-object.
- Relaties voor alle drie de entiteiten definiëren.
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"
Wederzijdse relaties
Als u navigatie in beide richtingen wilt toestaan (bijvoorbeeld van Book naar Author en van Author naar Book), definieer dan een tweede relatie op de doelentiteit die de bron- en doelvelden omkeert.
Voorbeeld
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"
Dit koppelt aan de Book naar Author relatie en maakt symmetrische doorkruising in GraphQL mogelijk.
{
authors {
items {
first_name
books {
items {
title
}
}
}
}
}
GraphQL-ondersteuning
- Gerelateerde velden worden weergegeven als geneste objecten.
- Kardinaliteit bepaalt of een lijst of één object wordt geretourneerd.
- GraphQL-typenamen en -velden komen overeen met configuratienamen.
Beperkingen
- Voor relaties moeten entiteiten bestaan in hetzelfde configuratiebestand.
- Er wordt slechts één hopnavigatie ondersteund.
- Cycli en diepe nesting zijn niet geoptimaliseerd.
- REST biedt geen ondersteuning voor relaties (alleen GraphQL).