Я новичок в graphql, и мне нужно запросить сразу несколько таблиц, чтобы отобразить некоторые данные. У меня есть информационная панель, которая показывает информацию о доме из 5 таблиц: адрес, человек, информация о хосте, комната и изображение. Изначально у меня есть person_id для запроса таблицы address, которая содержит person_id и т. д. Вот как выглядит краткий набросок uml:
entity Address {
AddressId BigInteger,
FK_PersonId BigInteger,
StreetNumber Integer,
...
}
entity HostInfo {
HostInfoId BigInteger,
FK_AddressId BigInt,
HomestayName String,
...
}
entity Room {
RoomId BigInteger,
FK_HostInfoId BigInteger,
RoomName String,
...
}
entity Image {
FK_AddressId BigInt,
FK_RoomID BigInt,
Name String,
....
}
entity Person {
PersonId,
FirstName String,
Age Integer required, //TODO remember to check age
}
У меня вопрос, как мне использовать graphql для получения всех данных из этих таблиц, используя только PersonId?
РЕДАКТИРОВАТЬ--------
Я реорганизовал определение типа следующим образом:
export type Address = {
StreetNumber: number,
//..
Person:Person
}
export type HostInfo = {
HomestayName: string,
//..
Person:Person,
Room:[Room!],
Address:Address
}
export type Room = {
RoomName: string,
//..
RoomImage:[RoomImage!],
HostInfo:HostInfo
}
export type RoomImage = {
Name: string,
//..
Room:Room,
}
export type HostInfoImage = {
Name: string,
..
HostInfo:HostInfo
}
export type PersonImage = {
Name: string,
//..
Person:Person
}
export type Person = {
FirstName: string,
..
PersonImage:[PersonImage]
Address:Address
}
и выполните запрос так:
query HostInfo($id: ID!) {
node(id: $id) {
... on Person {
firstName
address {
streetNumber
hostInfo {
HostName,
//...
Room {
RoomName,
[RoomImage],
//....
}
}
}
}
}
}
Я бы явно показал двусторонние отношения в своих сущностях ... Я ожидал большего от sql (ly) способа сделать это.


Обычно GraphQL представляет все связи между объектами явно в схеме: если в вашей модели базы данных Address ссылается на Person, то ваш тип Person GraphQL будет иметь список адресов. На языке схем GraphQL у вас может быть:
type Person implements Node {
id: ID!,
firstName: String,
age: Int!,
address: [Address!]!
}
Если бы вы знали идентификатор человека, типичный запрос на получение большей части доступных данных мог бы гипотетически выглядеть так:
query Person($id: ID!) {
node(id: $id) {
... on Person {
firstName
age
address {
streetNumber
hostInfo { ... }
}
}
}
}
В схеме в исходном вопросе может быть несколько адресов с одним и тем же FK_PersonId, что создаст отношение «один ко многим», где у одного человека может быть несколько адресов. Если Person имеет только один Address, то схема GraphQL может это отразить.
Я немного сбит с толку, почему в спецификации Person должен быть массив адресов? Поскольку мне это нужно, у человека будет ссылка 1 к 1 для адресации.