You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Hasura GraphQL中以对象形式传递表头插入关联表?

如何将Hasura GraphQL Mutation的表头字段整合为单个对象变量

我现在向Hasura GraphQL发送表头+明细结构的JSON数据,明细部分已经用数组对象变量$detalle来组织,但表头字段拆成了好多个单独变量。想把表头也整合为一个对象变量来优化代码结构,看了文档还是搞不懂怎么搭结构,现有查询和变量如下:

现有Mutation查询

mutation insertData(
  $presidente: bigint,
  $vocal1: bigint,
  $vocal2: bigint,
  $ano: Int,
  $libro: Int,
  $folio: Int,
  $ffolio: Int,
  $fecha: date,
  $c_alumno_p_f: Int,
  $institucion: bigint,
  $id_carrera: bigint,
  $id_mesa: bigint,
  $id_materia: bigint,
  $detalle : [detalle_acta_regulares_insert_input!]!
){
  insert_actas_regulares(
    objects:[
      {
        presidente: $presidente, 
        vocal1: $vocal1, 
        vocal2: $vocal2, 
        ano: $ano, 
        libro: $libro, 
        folio: $folio, 
        ffolio: $ffolio, 
        fecha: $fecha, 
        c_alumno_p_f: $c_alumno_p_f, 
        institucion: $institucion, 
        id_carrera: $id_carrera, 
        id_mesa: $id_mesa, 
        id_materia: $id_materia,
        detalle_acta_regulares:{
          data:
           $detalle
        }
      }
    ]
  ){
    affected_rows
  }
}

现有变量

{
  "presidente": 107, 
  "vocal1": 196, 
  "vocal2": 208, 
  "ano": 2022, 
  "libro": 2, 
  "folio": 1, 
  "ffolio": 2, 
  "fecha": "2022-11-07", 
  "c_alumno_p_f": 3, 
  "institucion": 17, 
  "id_carrera": 5, 
  "id_mesa": 40863, 
  "id_materia": 11347,
  "detalle": [
    {
      "id_alumno": 2186,
      "escrito": 4,
      "oral":0,
      "definitivo": 4
    },
    {
      "id_alumno": 9869,
      "escrito": 8,
      "oral":0,
      "definitivo": 8
    }
  ]
}

调整方案

直接利用Hasura自动生成的插入输入类型actas_regulares_insert_input来定义表头对象变量,步骤如下:

  1. 修改Mutation的变量声明:把原来的所有表头单独变量替换成一个$cabecera变量,类型指定为actas_regulares_insert_input!,保留$detalle变量。
  2. 调整Mutation内部的对象赋值:直接展开$cabecera,然后单独添加关联的detalle_acta_regulares部分(因为这部分是关联表数据,不属于主表的插入输入类型)。
  3. 重构变量结构:把原来的零散表头字段全部放到cabecera对象里,detalle部分保持不变。

修改后的Mutation查询

mutation insertData(
  $cabecera: actas_regulares_insert_input!,
  $detalle : [detalle_acta_regulares_insert_input!]!
){
  insert_actas_regulares(
    objects:[
      {
        ...$cabecera,
        detalle_acta_regulares:{
          data: $detalle
        }
      }
    ]
  ){
    affected_rows
  }
}

修改后的变量

{
  "cabecera": {
    "presidente": 107, 
    "vocal1": 196, 
    "vocal2": 208, 
    "ano": 2022, 
    "libro": 2, 
    "folio": 1, 
    "ffolio": 2, 
    "fecha": "2022-11-07", 
    "c_alumno_p_f": 3, 
    "institucion": 17, 
    "id_carrera": 5, 
    "id_mesa": 40863, 
    "id_materia": 11347
  },
  "detalle": [
    {
      "id_alumno": 2186,
      "escrito": 4,
      "oral":0,
      "definitivo": 4
    },
    {
      "id_alumno": 9869,
      "escrito": 8,
      "oral":0,
      "definitivo": 8
    }
  ]
}

这里用了GraphQL的对象展开语法(...$cabecera),把$cabecera对象里的所有字段直接展开到主表的插入对象中,再补上关联的明细数据部分,既精简了代码,又保持了结构清晰。


内容的提问来源于stack exchange,提问作者tarfik devs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:25:24