GraphQL查询交叉引用数据

时间:2017-04-21 13:19:57

标签: graphql

请在下面找到一个基本的简化问题和问题:

垄断示例

数据类型:

USER

  • 名称

  • 房屋(一对多)

STREET

  • 名称

HOUSE

  • 街道(一对一)

请注意,在我的数据模型中,用户和街道之间没有任何参考(也许垄断并不是最好的例子 - .-)

问题:

用户可以在不同的街道上拥有多个房屋。如何查询特定用户所拥有的街道列表?

通缉结果:

{
    "data": {
        "User": {
            "name": "The Hat",
            "streets": [
            {
                name: "Bow Street"
            },
            {
                name: "Oxford Street"
            },
            {
                name: "Park Lane"
            },
            ]
        }
    }
}

这可能吗?

1 个答案:

答案 0 :(得分:1)

通常通过在查询中使用嵌套字段来处理这样的关系数据。在查询中遍历数据图的能力是GraphQL的最大好处之一。

通常,this article about GraphQL APIs是了解其工作原理的有用资源。

让我们看看一些不同的可能查询。

查询特定用户拥有房屋的街道列表

query {
  allStreets(filter: {
    house: {
      user: {
        id: "user-id"
      }
    }
  }) {
    name
  }
}

在这里,我们使用传入的a relational filter作为参数来查询与特定用户相关的小时数相关的街道,从而产生:

{
  "data": {
    "allStreets": [
      {
        "name": "Bow Street"
      },
      {
        "name": "Oxford Street"
      },
      {
        "name": "Park Lane"
      }
    ]
  }
}

我们可以看到我们回到街道列表。我们还可以在allStreets查询中包含house字段以获取该信息。

查询特定用户对象及其所在的街道列表

query {
  User(id: "user-id") {
    name
    houses {
      street {
        name
      }
    }
  }
}

这里我们按id指定用户,因此结果的顶级对象是单个用户对象。此外,我们正在返回用户拥有房屋的街道列表:

{
  "data": {
    "User": {
      "name": "The Hat",
      "houses": [
        {
          "street": {
            "name": "Bow Street"
          }
        },
        {
          "street": {
            "name": "Oxford Street"
          }
        },
        {
          "street": {
            "name": "Park Lane"
          }
        }
      ]
    }
  }
}

值得注意的是,响应的结构精确地遵循了查询的结构。