用于在突变字段上映射数组的 GraphQL 语法
Posted
技术标签:
【中文标题】用于在突变字段上映射数组的 GraphQL 语法【英文标题】:GraphQL Syntax for mapping array on mutation field 【发布时间】:2020-11-22 07:01:48 【问题描述】:我正在寻找有关语法的建议。在我的查询中,我需要我的后端(Graphlite、Symfony)来获取子项。我获得常规项目的方式如下,并且工作正常。我对 GraphQL / Apollo / VueJS / GraphQLite 不够精通,不知道哪种技术拥有“id: $itemId”语法,我也不知道它叫什么,所以我找不到任何关于它的信息.
insertItem: gql` mutation insertItem(
$itemId: Uuid!,
$childItemIds: [Uuid!]!
)
insertItem(
item: id: $itemId,
childItems: id: in : $childItemIds
)
// ... stuff
`
因此,鉴于 id: $itemId 正确地用于获取项目,我假设有一些 graphQL 语法可以应用 childItemIds 来获取 childItems。这种映射有名称吗?语法是什么?
【问题讨论】:
$childItemIds
是Uuid
的列表。我认为没有办法将其转换为查询文本中的对象列表。您可能必须定义 childItem
对象类型并使用 $childItemIds: [childItem!]!
作为参数。或者修改insertItem
接受[Uuid!]!
,在服务端做映射。
您好,谢谢您的回复! Uuid -> 项目映射已经在服务器端发生,根据项目 id: $itemId 部分工作(我在服务器端得到一个“项目”对象)。那部分是graphqlite graphqlite.thecodingmachine.io/docs/input-types 设置。但是,由于 apollo 似乎很乐意接受 id: $itemId 作为良好的语法,我假设有一种方法可以从 Uuid 数组中传递等效的映射 id,这是我希望弄清楚的语法.
insertItem
在您的架构中是如何定义的?
预期的类型是 ItemInput!为项目,和 [ItemInput!]!对于子项。 ItemInput 是 GraphQLite 在 php 后端创建 Item 对象的中介。
那么$childItemIds
应该是[ItemInput!]!
。 Graphql 语法不允许在查询中从一个列表映射到另一个列表。 id: $itemId
有效,因为它是与 ItemInput
的形状匹配的单个项目。
【参考方案1】:
根据与@UjinT34 的讨论,由于无法通过 GraphQL 内联完成,因此我在调用突变之前创建了一个 ItemInput 数组:
for (var i = 0, len = item.childItems.length; i < len; i++)
childItems.push( id : item.childItems[i].id )
原来的查询变成了:
insertItem:`` gql` mutation insertItem(
$itemId: Uuid!,
$childItemIds: [ItemInput!]!
)
insertItem(
item: id: $itemId,
childItems: $childItemIds
)
// ... stuff
一旦我了解到id: $item
不是神奇的 GQL/GraphQLite 语法,而只是一个正在创建的内联 javascript 对象,解决方案就变得相当简单。
【讨论】:
以上是关于用于在突变字段上映射数组的 GraphQL 语法的主要内容,如果未能解决你的问题,请参考以下文章
如何在 GraphQL 突变中使用 FaunaDB 将数组传递给字段