嵌套对象的 Hasura GraphQL UPSERT 突变

Posted

技术标签:

【中文标题】嵌套对象的 Hasura GraphQL UPSERT 突变【英文标题】:Hasura GraphQL UPSERT mutation for nested objects 【发布时间】:2021-05-08 05:00:22 【问题描述】:

因此,我正在尝试使用变量构建一个突变,用于将“人员”的记录及其地址、电子邮件、电话信息插入/更新到多个表中。

mutation insertPerson ($address: [adr_insert_input!]!, $emails: [emails_insert_input!]!) 
  insert_info(objects: [
    f_name: "User1",
    l_name: "Test"
    address: 
        data: $address,
        on_conflict: 
          constraint: person_id_pk,
          update_column: [add_text_line1, zip_code]
        
    ,
    emails: 
      data: $emails,
      on_conflict: 
          constraint: person_id_pk,
          update_column: [email_text]
        
    
  ], on_conflict: 
    constraints: person_pk,
    update_columns: [f_name, l_name]
  ) 
   affected_rows
  

我的变量设置如下...


  "address": [
    "add_text_line1": "123 Main Street",
    "zip_code": 50501
  ],
  "emails": [
     "email_text": "FirstLastName@email.com"
  ]

工作符合我的预期(电子邮件数组中也有多个值),但我还需要将 f_name 和 l_name 值(整个 Person 对象)移动到一个变量中。我如何做到这一点?

我以这种方式尝试了以下突变,但这导致两个单独的插入和空值被传递...

mutation insertPerson ($person: person_insert_input!, $address: [adr_insert_input!]!)
  insertData(objects: [
    $person,
    
      address:  data: $address 
    
  ])  affected_rows 

这导致了两个单独的插入...第一个人的地址为空,然后人的地址为空。

如何实现第一个突变的结果,同时使用 Person Info 作为变量的一部分将其硬编码到查询本身中?

谢谢!

【问题讨论】:

【参考方案1】:

您需要将 insert_info 对象作为变量传递

mutation insertPerson ($info_objects: [insert_info_insert_input!]!) 
  insert_info(objects: $info_objects, on_conflict: 
    constraints: person_pk,
    update_columns: [f_name, l_name]
  ) 
   affected_rows
  

您的变量将是 info_objects 的数组

info_objects: [
    f_name: "User1",
    l_name: "Test"
    address:  data: [
    "add_text_line1": "123 Main Street",
    "zip_code": 50501
  ],  
        on_conflict: 
          constraint: person_id_pk,
          update_column: [add_text_line1, zip_code]
        
    ,
    emails: 
      data: [
     email_text: "FirstLastName@email.com"
  ],
      on_conflict: 
          constraint: person_id_pk,
          update_column: [email_text]
        
    
  ]

【讨论】:

谢谢,这确实有效......我遇到了类似的事情,但希望在没有 on_conflict 的情况下构建变量(因为这很难从应用程序动态构建)跨度>

以上是关于嵌套对象的 Hasura GraphQL UPSERT 突变的主要内容,如果未能解决你的问题,请参考以下文章

hasura graphql 模式拼接demo

为啥我使用 graphql > hasura > postgres 保存日期时出错

hasura graphql 集成pipelinedb测试

比较 GraphQL Hasura 中的两个字段

hasura graphql 角色访问控制

hasura graphql server 集成gatsby