Dela via


Entitetsrelationer i Data API Builder

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 relationships i entitetskonfigurationen.
  • Ange namnet target.entity .
  • Ange cardinality som "one" eller "many".
  • Du kan också ange source.fields och target.fields.
  • Använd linking.object nä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 Series har många Books.
  • 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 Book tillhör en Series.
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).