我正在尝试编写一个查询来检索具有属性linkedCards
的对象,该对象包含具有不同架构的对象数组。
我有 3 种不同的架构(内置于内容(:
卡举个例子:
{
id: 42,
productName: 'Laptop',
price: 999
}
卡 B 示例:
{
id: 999,
title: 'Buy our refurbished Laptops today!'
}
卡C示例:
{
id: 100,
linkedCards: [
{
id: 42,
productName: 'Laptop',
price: 999
},
{
id: 999,
title: 'Buy our refurbished Laptops today!'
}
]
}
查询:
allCardC() {
nodes {
linkedCards {
id
title
}
}
}
当我尝试运行以下 GraphQL 查询时,我得到 "Cannot query field "title" on type "CardACardBUnion". Did you mean to use an inline fragment on "CardA" or "CardB"?"
有没有内置的方法可以做到这一点,或者我可以以某种方式使用 CardA
和 CardB
的 id?也许有一个查询来获取linkedCards
卡的 ID,另一个查询来获取所述卡?
如错误所示,在查询解析为并集的字段时,需要使用内联片段:
allCardC {
nodes {
linkedCards {
... on CardA {
id
productName
price
}
... on CardB {
id
title
}
}
}
}
片段可以在选择集中内联定义。这样做是为了根据字段的运行时类型有条件地包含字段。
与接口或常规对象类型不同,联合不指定任何特定字段,只指定组成联合的类型。这意味着返回并集的字段的选择集必须始终使用片段根据字段解析为的实际类型有条件地指定字段。
这就像说,"如果这是返回对象的实际类型,请请求这些字段"。
发现使用 GraphQL 接口来指定每种卡类型共有的字段很有用。
interface Card {
id: ID!
}
# type CardA implements Card { ... }
type CardB implements Card {
id: ID!
title: String!
}
type CardC implements Card {
id: ID!
linkedCards: [Card!]!
}
正如@DanielRearden的回答所建议的那样,您仍然需要使用(内联(片段来选择特定于其中一种卡片类型的字段,但是现在您知道每张卡片都有一个id
字段,您可以直接选择该字段。
allCardC {
nodes {
linkedCards {
id
... on CardB { title }
}
}
}