如何在 GraphQL 突变中使用 FaunaDB 将数组传递给字段

Posted

技术标签:

【中文标题】如何在 GraphQL 突变中使用 FaunaDB 将数组传递给字段【英文标题】:How to in GraphQL mutation pass an array to a field using FaunaDB 【发布时间】:2021-06-22 12:36:45 【问题描述】:

我不认为我以正确的 graphQL 方式做事,但我不确定如何在 graphQL 中实现它。

我有以下架构,然后将其上传到 FaunaDB,他们做了一些魔术将其变成可用的 graphQL api 端点。

type Catalog 
  decor: Boolean
  clothing: Boolean
  supplies: Boolean
  furniture: Boolean
  owner: User


type Decor 
  description: String
  pieces: Int
  purchaser: String
  alterations: Boolean
  cost: Int
  purchaseDate: Date
  category: String
  image: String
  itemNum: Int
  owner: User!
  visible: Boolean


type DecorSheet 
  sheetName: String
  refIdArray: String
  owner: User!


type User 
  email: String! @unique
  catalog: Catalog
  decor: [Decor!] @relation
  decorSheet: [DecorSheet!] @relation


type Query 
  getMultipleDecors(DecorId: [ID!]): [Decor]
    @resolver(name: "get_multiple_decors")

我需要创建一个 DecorSheet 类型,我需要 refIdArray,像这样的对象数组

[
    
        "refId0": "293164663883956749"
    ,
    
        "refId1": "293526016787218952"
    
]

我有以下突变 gql 供阿波罗触发

const CREATE_DECOR_SHEET = gql`
  mutation CreateDecorSheet(
    $ownerID: ID!
    # $description: String!
    $sheetName: String
    $refIdArray: String!
  ) 
    createDecorSheet(data:  sheetName: $sheetName, refIdArray: $refIdArray, owner:  connect: $ownerID  ) 
      refIdArray
      sheetName
      _id
    
  
`;

我在这里称呼它

const res = await createDecorSheet(
      variables: 
        ownerID: user.id,
        // ...dataMassage,
        sheetName: dataForm.sheetName,
        refIdArray: JSON.stringify(chosenValues), //A WAY TO DO THIS GRAPHQL STYLE
      ,
    ).catch(console.error);

目前我正在对 selectedValues 进行字符串化,这与我在上面列出的数组中 refId 和 Id 对象的值相同。

有没有更好的方法来做到这一点,我是否需要编写一个自定义突变,您可以将一个对象数组传递给 refIdArray。

如果有人可以帮助解决这个问题,那就太好了。

谢谢

【问题讨论】:

只需传递 id 数组,就像在查询中一样......它是解析器的角色,可以使输入数据适应 DB 要求(隐藏实现)或“提取”到所需的数据形状 所以你可以将一个 id 数组作为字符串值传递?这听起来不太对我来说,但我会尝试。我认为它会向我抱怨它不是字符串值。我会报告的 我得到了Variable '$refIdArray' expected value of type 'String!' but got: ["293164663883956749","293526016787218952"] 是否需要将架构更改为refIdArray: [id] 好吧,那行得通。谢谢 @AndersKitson 您可能应该用解决方案编写自己的答案,它肯定会帮助其他人! :) 【参考方案1】:

我最终将架构更新为

type DecorSheet 
  sheetName: String
  refIdArray: [ID]
  owner: User!

然后我就按原样传递了我的数组

const res = await createDecorSheet(
        variables: 
       ownerID: user.id,
          // ...dataMassage,
          sheetName: dataForm.sheetName,
          refIdArray: chosenValues, //array here
        ,
      ).catch(console.error);

gql 突变看起来也是这样

 const CREATE_DECOR_SHEET = gql`
    mutation CreateDecorSheet(
      $ownerID: ID!
      # $description: String!
      $sheetName: String
      $refIdArray: [ID]
    ) 
      createDecorSheet(
        data: 
          sheetName: $sheetName
          refIdArray: $refIdArray
          owner:  connect: $ownerID 
        
      ) 
        refIdArray
        sheetName
        _id
      
    
  `;

【讨论】:

以上是关于如何在 GraphQL 突变中使用 FaunaDB 将数组传递给字段的主要内容,如果未能解决你的问题,请参考以下文章

apollo 客户端是不是支持事务?

设计表单构建器的数据库和状态突变和请求,以与 graphQL、动物数据库、nextJS 和 Apollo 做出反应

在 FaunaDB 中更新记录时,如何在不传入每个字段和子对象的情况下更新一个字段?

如何在 GraphQL 中使用可选参数实现突变?

如何在突变 graphQL Playground 中传递变量?

如何在 python 函数中编写 graphQL 突变?