graphql - GraphQL如何查询多态关系?
问题描述
假设我有一个“爸爸”实体,它可能引用一个“儿子”或“女儿”实体。
我想构建一个图形 ql 查询,它将获取爸爸的名字 + 孩子的名字(儿子或女儿)
Dad
|_Son
or
|_Daughter
我发现使用片段可能是一种方法:
{
DadCollection {
items {
name
child {
__typename
...Son{
name
}
...Daughter{
name
}
}
}
}
}
只是想知道是否有更优雅的方式来执行上述查询避免代码冗余,或者是否有更好的方式来获取信息
另外......这是graphQL的一般行为还是由于这个特定的graphQL模式服务器实例是如何配置来检索数据的?
解决方案
这归结为单个模式。
GraphQL 有两种抽象类型——接口和联合。一个字段可能返回一个抽象类型,但该类型必须始终在运行时解析为对象类型。联合和接口在功能上是相同的,除了两个不同之处: 1) 联合显式定义它们可能的类型,而类型必须显式实现接口;2) 接口定义了所有实现类型必须具有的一组公共字段。
后一个区别的含义是,在查询接口字段时,您不必使用片段来指定可能的类型*当查询共享字段时**。换句话说,联合字段上的查询看起来像这样:
query {
someUnion {
# no fields allowed outside fragments
... on Foo {
foo
}
... on Bar {
bar
}
}
}
对接口字段的查询可能如下所示:
query {
someInterface {
aCommonField
anotherCommonField
... on Foo {
foo
}
... on Bar {
bar
}
}
}
但是,需要注意的是,仅仅因为两种类型共享一个字段,并且两种类型都实现了一个接口,并不一定意味着该字段是接口上的一个字段。像上面这样的查询仅仅让字段很常见是不够的——它们必须明确地成为接口定义的一部分。
因此,您是否实际上可以避免name
为每个内联片段键入取决于 1) 字段是否是接口,以及 2) 相关字段是否是接口定义的一部分。
推荐阅读
- sql - 如果 n-1、n-2.. 结果在 n 的 30 天内,则在分区中获得第 n 个结果
- excel - 尝试用 Excel 单元格内容替换书签时出现 MS Word 自动化错误
- jquery - 通过 JQuery 检测元素上的内联样式/CSS 更改
- python - 汇总 Dataframe 中具有匹配列标题的列
- excel - 是否有 VBA 代码根据另一个列表从过滤器中排除项目
- javascript - Javascript:更简洁的按键减少/聚合方式?
- python - 无法在 Jupyter 降价单元格中显示图像文件
- vue.js - Vue.js/Vuetify:如何使 v-card-actions 反应?
- flutter - 是否可以在 Dart 中屈服于外部作用域?
- amazon-s3 - 如何在 Solaris 上构建 AWS C++ SDK?