将获取的字段传递给GraphQL中的另一个(嵌套)查询

将获取的字段传递给GraphQL中的另一个(嵌套)查询,graphql,Graphql,想象一下下面的查询: query { user { id } SomeOtherStuff(id: <--- I want to pass the id obtained from user) { id } } 查询{ 使用者{ 身份证件 } SomeOtherStuff(id:在GraphQL中,请求的每个“级别”的字段都是并行执行和解析的。在您的示例中,user和SomeOtherStuff都是相同类型的字段(根查询类型)--因此它们将同时被解析。这意

想象一下下面的查询:

query {
  user {
    id
  }
  SomeOtherStuff(id: <--- I want to pass the id obtained from user) {
    id
  }
}
查询{
使用者{
身份证件
}

SomeOtherStuff(id:在GraphQL中,请求的每个“级别”的字段都是并行执行和解析的。在您的示例中,
user
SomeOtherStuff
都是相同类型的字段(根
查询
类型)--因此它们将同时被解析。这意味着每个查询本质上不知道另一个查询或另一个查询解析了什么

您必须在客户端处理这种场景。换句话说,首先请求用户,解析id的响应,然后发出第二个请求

编辑:在Apollo中,您可以使用compose来实现此目的:

const userQuery = gql`query User { user { id } }`;
const stuffQuery = gql`query SomeOtherStuff($id: ID) { someOtherStuff(id: $id){ stuff } }`;

export default compose(
  graphql(userQuery, { name: 'userData' })
  graphql(stuffQuery, { name: 'stuffData', options: ({userData:{id}={}}) => ({variables: {id}}) }),
)(YourComponent)

我同意@DanielRearden。你应该制作类型解析程序,这样你就可以无限深入到图中。我制作了一个简单的服务器示例,显示了深层的关系。因为所有的名词字段都是引用,所以任何查询都会无限深入

使用该服务器,您可以运行如下查询,例如:

{
  hero {
    name
    friends {
      name
      friends {
        name
        friends {
          name
          friends: {
            name
          }
        }
      }
    }
  }
}
因此,在您的示例中,将其结构如下:

query {
  user {
    id
    otherStuff {
      id
    }
  }
}

我一直在寻找相同的场景,并在这个问题上达成一致。你可以让它以其他方式工作。这完全取决于你如何编写graphql解析器,你需要确保你的数据库关系是完整的。我已经让它这样工作


您还没有说明您使用的是哪种语言和GraphQL客户端,或者您使用的是现有的API还是自己设计的API。这些信息将有助于为您的问题提供更全面的答案。@DanielRearden我正在使用Apollo,我正在学习并遇到许多类似的问题。这k对我的GraphQL查询很有帮助fu:我认为您应该重命名您的问题,并将查询更改为“嵌套查询”,那么您可能会得到您真正想要的。@AdamWalski感谢您的回复。这与我对GraphQL的期望完全不同。我认为将多个请求合并为一个请求的想法是GraphQL的主要原则。对于我来说,这似乎是相当基本的场景,即获取依赖于用户但不嵌套在使用中的其他数据r本身…是否有任何方法可以获取依赖于用户且不嵌套在用户类型(在同一请求中)中的数据?简短回答:不。我冒昧地说,被迫处理您描述的情况表明API设计不佳。问题是,如果有与用户相关的数据,它应该是用户类型的一部分。如果数据与当前登录的用户(查看器)相关,应该有一个上下文感知的查看器查询,允许您访问它,而不必首先获取查看器的ID。如果使用compose,这两个查询会在单个请求-响应对中执行吗?