如何从GraphQL的$data变量提取特定字段传入关联查询?
问题:GraphQL中如何从复杂输入变量提取字段传递给另一个查询参数
背景Schema定义
input GetPublicationsDto { cursor: Int take: Int tagIds: [Int!] tagId: Int ... } input GetTagsForDto { tagIds: [Int!] tagId: Int } type Query { publications(data: GetPublicationsDto!): [Publication!]! tagsFor(data: GetTagsForDto!): [Tag!]! }
注:GetPublicationsDto包含GetTagsForDto的所有字段,意图实现类似继承的效果。
尝试的查询及报错
- 直接复用变量
尝试在单个请求中按指定tagId获取出版物及对应标签,编写查询如下:
query PublicationsWithTags($data: GetPublicationsDto!) { publications(data: $data) { ...PublicationEntry } tagsFor(data: $data) { ...TagEntry } }
编译失败,报错:
Variable "$data" of type "GetPublicationsDto!" used in position expecting type "GetTagsForDto!".
- 尝试提取字段传递
修改写法试图从$data中提取tagId字段:
query PublicationsListWithTags($data: GetPublicationsDto!) { publications(data: $data) { ...PublicationListEntry } tagsFor(data: { tagId: $data.tagId }) { id name } }
仍编译失败,报错:
Cannot parse the unexpected character "."
核心问题
如何从$data中提取特定字段,传递给tagsFor查询的GetTagsForDto类型参数?
解决方案
GraphQL查询语法不支持直接在变量内部引用另一个变量的属性(即$data.tagId这种写法不被允许),有两种可行解决方式:
方式1:拆分变量定义
分别定义对应两个输入类型的变量,调用时传入相同的tagId值:
query PublicationsListWithTags( $pubData: GetPublicationsDto!, $tagData: GetTagsForDto! ) { publications(data: $pubData) { ...PublicationListEntry } tagsFor(data: $tagData) { id name } }
调用时确保$pubData.tagId与$tagData.tagId值一致即可。
方式2:调整Schema定义(推荐)
既然GetPublicationsDto已包含GetTagsForDto的所有字段,可将tagsFor的参数类型改为GetPublicationsDto!,直接复用同一个变量:
type Query { publications(data: GetPublicationsDto!): [Publication!]! tagsFor(data: GetPublicationsDto!): [Tag!]! }
修改后即可直接使用最初的查询写法,无需调整变量逻辑。
若无法修改Schema,方式1是最直接的兼容方案;若有权限调整Schema,方式2能简化查询逻辑,避免重复传参。
内容的提问来源于stack exchange,提问作者Kasheftin
相关产品推荐
相关产品推荐

