Graphql - запрос нескольких таблиц

Я новичок в 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
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
0
4 131
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обычно 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 { ... }
      }
    }
  }
}

Я немного сбит с толку, почему в спецификации Person должен быть массив адресов? Поскольку мне это нужно, у человека будет ссылка 1 к 1 для адресации.

SomethingsGottaGive 13.07.2018 03:14

В схеме в исходном вопросе может быть несколько адресов с одним и тем же FK_PersonId, что создаст отношение «один ко многим», где у одного человека может быть несколько адресов. Если Person имеет только один Address, то схема GraphQL может это отразить.

David Maze 13.07.2018 03:22

Другие вопросы по теме