在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`……通常您希望消息具有作者,很少希望消息具有作者