Sdílet prostřednictvím


Relace entit v Tvůrci rozhraní DATA API

Relace entit umožňují dotazům GraphQL procházet související entity, což umožňuje komplexní datové obrazce jediným dotazem. Například:

{
  books {
    items {
      id
      title
      authors {
        items {
          first_name
          last_name
        }
      }
    }
  }
}

Aby toho lze dosáhnout, je potřeba DAB sdělit, jak entity souvisejí prostřednictvím oddílu relationships v konfiguračním souboru.

Konfigurace

Definování vztahu mezi entitami:

  • relationships Použijte objekt uvnitř konfigurace entity.
  • target.entity Zadejte název.
  • Nastavit cardinality jako "one" nebo "many".
  • Volitelně zadejte source.fields a target.fields.
  • Použijte linking.object při modelování vztahů mnoha k mnoha bez zobrazení tabulky spojení.

Příklad rozhraní příkazového řádku

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"

Příklad konfigurace

"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" ]
    }
  }
}

Jedno ke mnoha

  • Použijte kardinalitu "many".
  • Příklad: A Series má mnoho Books.
  • Systém DAB může odvodit pole, pokud existuje cizí klíč.
dab update Series \
  --relationship books \
  --target.entity Book \
  --cardinality many

Mnoho-na-jeden

  • Použijte kardinalitu "one".
  • Příklad: A Book patří do jednoho Series.
dab update Book \
  --relationship series \
  --target.entity Series \
  --cardinality one

mnoho-na-mnoho (propojovací objekt)

  • Použijte tabulku spojení, která není vystavená v GraphQL.
  • Definujte propojení polí ze zdroje na cíl prostřednictvím tabulky spojení.
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:N (explicitní spojovací entita)

  • Vystavení tabulky spojení jako objektu GraphQL
  • Definujte relace u všech tří entit.
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"

Reciproční vztahy

Chcete-li povolit navigaci v obou směrech (například od Book do Author a od Author do Book), definujte na cílové entitě druhou relaci, která obrátí zdrojová a cílová pole.

Příklad

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"

Tato dvojice odpovídajících vztahů Book a Author umožňuje symetrické procházení v GraphQL.

{
  authors {
    items {
      first_name
      books {
        items {
          title
        }
      }
    }
  }
}

Podpora GraphQL

  • Související pole se zobrazují jako vnořené objekty.
  • Kardinalita určuje, zda je vrácen seznam nebo jeden objekt.
  • Názvy a pole typu GraphQL odpovídají názvům konfigurace.

Omezení

  • Relace vyžadují, aby entity existovaly ve stejném konfiguračním souboru.
  • Podporuje se pouze jednoskoková navigace.
  • Cykly a hluboké vnoření nejsou optimalizovány.
  • REST nepodporuje relace (pouze GraphQL).