假设我们有一个变异,该变异返回仅具有属性id
的对象数组。要“完成”此类型,我们必须为该对象的每个属性创建一个解析器。
相反,我希望能够创建一个可以完成一个对象的解析器。
在下面的查询示例中,该查询发送了英雄列表和最喜欢的英雄的变体。 mutation setFavorite(id)
的解析器仅返回IDs
的列表。
type Query {
heroes(first: Int = 10) [Hero]
}
type Hero {
id: ID!
title: String!
}
type Mutation {
setFavorite(id: ID!): [Hero]
}
const resolvers = {
Query: {
heroes(_, {first}, {heroes}) {
return heroes.get({first});
}
},
Mutation: {
setFavorite(_, {id}, {favorites}) {
await favorites.setFavorite(id);
return favorites.getAll(); // <<<< these are only IDs
}
}
}
const resolvers = {
Hero: {
// vvvvvv something like this
__type(parent, _, {heroes}) {
if (parent.id) {
return heroes.getOne({id: parent.id});
}
}
}
}
答案 0 :(得分:0)
只有字段是 resolved ,因此您只能为字段而不是类型编写解析器。您的选择是:
更改类似public partial class AdminUIGI : FormBase.FormBase
之类的方法,以实际返回所讨论模型的实例,而不仅仅是返回ID。
将返回的ID映射到每个解析器中的模型实例。
为每个子字段编写一个解析器:
getAll
请注意,在此示例中,我们使用dataloader。这样,我们就可以将对const resolvers = {
Hero: {
title: (id, args, ctx) => {
const hero = await ctx.dataloaders.hero.findById(id)
return hero.title
},
someOtherField: (id, args, ctx) => {
const hero = await ctx.dataloaders.hero.findById(id)
return hero.someOtherField
},
},
}
的调用进行批处理,并且避免为相同的ID两次调用该方法。如果没有DataLoader,则不应使用此模式;否则,您将收到不必要的数据库附加调用。