用于在突变字段上映射数组的 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。这种映射有名称吗?语法是什么?

【问题讨论】:

$childItemIdsUuid 的列表。我认为没有办法将其转换为查询文本中的对象列表。您可能必须定义 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 将数组传递给字段

在 Graphcool / GraphQL 中发布更新突变时如何“更新”数组/嵌套字段?

GraphQL 嵌套文档在突变时返回 null

嵌套资源上的 GraphQL 突变

graphql 查询或突变能否返回标量值

Apollo GraphQL:未在突变子字段上调用解析器