【问题标题】:graphql - querying multiple tablesgraphql - 查询多个表
【发布时间】:2018-12-21 05:40:11
【问题描述】:

我是 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


    【解决方案1】:

    通常 GraphQL 会在模式中显式表示对象之间的所有链接:如果在您的数据库模型中 Address 引用 Person,那么您的 Person GraphQL 类型将具有地址列表。在 GraphQL 模式语言中,您可能有:

    type Person implements Node {
      id: ID!,
      firstName: String,
      age: Int!,
      address: [Address!]!
    }
    

    如果您知道一个人的 ID,那么检索大部分可用数据的典型查询可能看起来像

    query Person($id: ID!) {
      node(id: $id) {
        ... on Person {
          firstName
          age
          address {
            streetNumber
            hostInfo { ... }
          }
        }
      }
    }
    

    【讨论】:

    • 我有点困惑,为什么 Person 在规范中有一个地址数组?根据我的需要,人将有一个一对一的地址引用。
    • 在原始问题的架构中,可能有多个地址具有相同的FK_PersonId,这将创建一对多的关系,其中一个人可以有多个地址。如果Person 只有一个Address,那么 GraphQL 模式可以反映这一点。
    猜你喜欢
    • 2021-02-18
    • 2018-06-16
    • 2021-05-29
    • 2020-10-23
    • 2016-04-23
    • 2021-07-16
    • 2020-08-17
    • 2022-10-19
    • 2017-03-07
    相关资源
    最近更新 更多