对交叉引用数据的GraphQL查询

对交叉引用数据的GraphQL查询,graphql,Graphql,请在下面找到一个基本的简化问题和一个问题: 垄断的例子 数据类型: 使用者 名字 房屋(一对多) 街头 名字 房子 街道(一对一) 请注意,在我的数据模型中,用户和街道之间没有引用(可能垄断不是最好的例子-。-) 问题: 一个用户可以在不同的街道上拥有多个房屋。如何查询特定用户拥有房屋的街道列表 通缉结果: { "data": { "User": { "name": "The Hat", "streets": [

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

垄断的例子 数据类型:

使用者

  • 名字

  • 房屋(一对多)

街头

  • 名字
房子

  • 街道(一对一)
请注意,在我的数据模型中,用户和街道之间没有引用(可能垄断不是最好的例子-。-)

问题:

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

通缉结果:

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

这可能吗?

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

一般来说,是了解其工作原理的有用资源

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

查询特定用户拥有房屋的街道列表 在这里,我们使用传入作为参数来查询与特定用户相关的小时数相关的街道,结果如下:

{
  "data": {
    "allStreets": [
      {
        "name": "Bow Street"
      },
      {
        "name": "Oxford Street"
      },
      {
        "name": "Park Lane"
      }
    ]
  }
}
我们可以看到,我们得到了一张街道列表。我们还可以在
allStreets
查询中包含house字段,以获得该信息

查询特定用户对象及其上有房屋的街道列表 在这里,我们通过id指定一个用户,因此结果的顶级对象是单个用户对象。此外,我们还获得了用户拥有房屋的街道列表:

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

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

因此graphQL足够聪明,能够理解:用户->房屋->位置?对不起!我没有正确地遵循所描述的数据模型。让我更新我的答案:)
query {
  User(id: "user-id") {
    name
    houses {
      street {
        name
      }
    }
  }
}
{
  "data": {
    "User": {
      "name": "The Hat",
      "houses": [
        {
          "street": {
            "name": "Bow Street"
          }
        },
        {
          "street": {
            "name": "Oxford Street"
          }
        },
        {
          "street": {
            "name": "Park Lane"
          }
        }
      ]
    }
  }
}