在GraphQL操作中使用嵌套参数

在GraphQL操作中使用嵌套参数,graphql,Graphql,我有这样一个模式: scalar Date schema { query: Query } type Query { user(id: ID!): User messages(userId: ID!): [ChatMessage!]! } type User { id: ID! username: String! email: String! } type ChatMessage { id: ID! content: String! time: Dat

我有这样一个模式:

scalar Date

schema {
  query: Query
}

type Query {
  user(id: ID!): User
  messages(userId: ID!): [ChatMessage!]!
}

type User {
  id: ID!
  username: String!
  email: String!
}

type ChatMessage {
  id: ID!
  content: String!
  time: Date!
  user: User!
}
我想做一个操作,您可以为一个用户获取所有消息,但是由于
user
ChatMessage
在不同的数据库表中,我需要执行两个查询(一个用于获取
ChatMessages
,另一个用于获取
user
),因此我认为应该这样建模:

query findMessagesForUser($userId: ID!) {
  messages(userId: $userId) {
    id
    content
    user(id: $userId) {
      username
      email
    }
  }
}
这将返回架构上的分析错误:

GraphQLDocumentError:字段“ChatMessage.user”上的未知参数“id”


那么,如何将
$userId
参数传递给
ChatMessage.user
的解析器?

在您的模式中,您已经在Query.user方法上定义了一个id输入。在查询中,您试图为Message.user属性提供一个id,但尚未在架构中定义此输入

如果要接受ChatMessage.user上的id,则需要将其定义为:

type ChatMessage {
  id: ID!
  content: String!
  time: Date!
  user(id: ID!): User
}
然而,这样构造一个模式(至少对我来说)是没有意义的,我假设每条消息只有一个用户(作者)

如@xadm所示,您在ChatMessage级别解析的对象将作为第一个参数传递给用户解析器

即使您没有在模式中公开ChatMessage.userId(这很好),您仍然可能会将其加载到后端(ChatMessage表中的外键值),并在用于解析ChatMessage的对象上设置它

这样,如果用户包含在查询中,您将使用父ChatMessage对象参数的userId属性(记住,您不需要通过模式公开ChatMessage.userId,它只在用于解析ChatMessage的对象上)来(延迟)加载用户

<>我会考虑更像这样的模型(过滤器输入作为一个附加的设计实例):

在解析器映射中,可以连接相同的函数以在用户级别和查询级别解析消息。唯一的区别是在查询级别没有用户ID

如果消费者希望查看/搜索来自所有用户的消息,他们将使用顶级查询消息方法

{
  messages({search: 'graphql'}) {
   id,
   content,
   time
  }
}
如果消费者希望查看/搜索一个用户的消息,请通过顶级查询用户方法进入消息

{
  user(id: 3) {
    messages({search: 'graphql'}) {
     id,
     content,
     time
    }
  }
}
过滤器示例是人为设计的,但可以为消息加载提供基本分页

{
  user(id: 3) {
    messages({search: 'graphql'}) {
     id,
     content,
     time
    }
  }
}

apollographql.com/docs/graphql工具/解析器

无需。。。将arg保存在消息解析对象中,由父arg访问-搜索SOrather`messages({search:'graphql',userId:xxx}){id,content,user{name`……通常您希望消息具有作者,很少希望消息具有作者