Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Связи сущностей позволяют запросам GraphQL проходить по связанным сущностям, что позволяет создавать сложные фигуры данных с помощью одного запроса. Рассмотрим пример.
{
books {
items {
id
title
authors {
items {
first_name
last_name
}
}
}
}
}
Чтобы добиться этого, DAB необходимо указать, как сущности связаны с помощью relationships раздела в файле конфигурации.
Конфигурация
Чтобы определить связь между сущностями, выполните следующие действия.
- Используйте объект
relationshipsвнутри конфигурации сущности. -
target.entityУкажите имя. - Установите
cardinalityкак"one"или"many". - При необходимости укажите
source.fieldsиtarget.fields. - Используйте
linking.objectпри моделировании связей "многие ко многим", не отображая таблицу соединений.
Пример интерфейса командной строки
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"
Пример конфигурации
"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" ]
}
}
}
Один ко многим
- Используйте кратность
"many". - Пример: Один
Seriesимеет многоBooks. - DAB может выводить поля, если существует внешний ключ.
dab update Series \
--relationship books \
--target.entity Book \
--cardinality many
Много к одному
- Используйте кардинальность
"one". - Пример: A
Bookпринадлежит одномуSeries.
dab update Book \
--relationship series \
--target.entity Series \
--cardinality one
Многие-ко-многим (связывающий объект)
- Используйте таблицу соединения, которая не предоставляется в GraphQL.
- Определите привязку полей из источника к целевому объекту через таблицу соединения.
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"
"Многие ко многим" (явная сущность соединения)
- Предоставление таблицы соединения в виде объекта GraphQL.
- Определите связи для всех трех сущностей.
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"
Взаимные отношения
Чтобы разрешить навигацию в обоих направлениях (например, от Book до Author и от Author до Book), определите вторую связь в целевой сущности, которая изменяет исходные и целевые поля.
Пример
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"
Это образует пару с отношением Book к Author и позволяет симметричный обход в GraphQL.
{
authors {
items {
first_name
books {
items {
title
}
}
}
}
}
Поддержка GraphQL
- Связанные поля отображаются как вложенные объекты.
- Кратность определяет, возвращается ли список или один объект.
- Имена типов GraphQL и поля соответствуют именам конфигурации.
Ограничения
- Связи требуют, чтобы сущности существовали в одном файле конфигурации.
- Поддерживается только однохоповая навигация.
- Циклы и глубокое вложение не оптимизированы.
- REST не поддерживает связи (только GraphQL).