Aracılığıyla paylaş


Veri API'si oluşturucusunda varlık ilişkileri

Varlık ilişkileri, GraphQL sorgularının ilgili varlıklar arasında geçiş yapmalarına olanak tanıyarak karmaşık veri şekillerini tek bir sorguyla etkinleştirir. Örneğin:

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

Bunu başarmak için, DAB'ye varlıkların yapılandırma dosyasındaki relationships bölüm aracılığıyla nasıl ilişkili olduğu anlatılmalıdır.

Konfigürasyon

Varlıklar arasında ilişki tanımlamak için:

  • Varlık yapılandırması içindeki relationships nesnesini kullanın.
  • target.entity adını sağlayın.
  • cardinality öğesini "one" veya "many" olarak ayarlayın.
  • İsteğe bağlı olarak source.fields ve target.fields belirtin.
  • linking.object birleştirme tablosunu göstermeden çoka çok ilişkileri modellerken kullanın.

CLI örneği

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"

Yapılandırma örneği

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

Bire Çok

  • Kardinalitesini "many"kullanın.
  • Örnek: A'da Series çok sayıda Booksvardır.
  • DAB, yabancı anahtar varsa alanları türetebilir.
dab update Series \
  --relationship books \
  --target.entity Book \
  --cardinality many

Çoka Bir

  • Kardinalitesini "one"kullanın.
  • Örnek: A Book , bir Seriesöğesine aittir.
dab update Book \
  --relationship series \
  --target.entity Series \
  --cardinality one

Çoktan Çoka (bağlantı nesnesi)

  • GraphQL'de sunulmayan bir birleştirme tablosu kullanın.
  • Birleştirme tablosu aracılığıyla kaynaktan hedefe bağlantı alanları tanımlayın.
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"

Çoka Çok (açık eşleme varlığı)

  • Birleştirme tablosunu GraphQL nesnesi olarak kullanıma sunma.
  • Üç varlıkta da ilişkileri tanımlayın.
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"

Karşılıklı ilişkiler

Her iki yönde de gezintiye izin vermek için (örneğin, Book öğesinden Author ve Author öğesinden Book hedeflerine), hedef varlıkta kaynak ve hedef alanları tersine çeviren ikinci bir ilişki tanımlayın.

Örnek

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"

Bu, Book ve Author ilişkisi ile eşleştirme sağlar ve GraphQL'de simetrik dolaşmayı etkinleştirir.

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

GraphQL desteği

  • İlgili alanlar iç içe nesneler olarak görünür.
  • Kardinalite, bir listenin mi yoksa tek bir nesnenin mi döndürüleceğini belirler.
  • GraphQL tür adları ve alanları yapılandırma adlarıyla eşleşmektedir.

Sınırlamalar

  • İlişkiler, varlıkların aynı yapılandırma dosyasında mevcut olmasını gerektirir.
  • Yalnızca tek atlamalı gezinti desteklenir.
  • Döngüler ve derin iç içe geçme iyileştirilmemiştir.
  • REST ilişkileri desteklemez (yalnızca GraphQL).