如何在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来定义表头对象变量,步骤如下:
- 修改Mutation的变量声明:把原来的所有表头单独变量替换成一个
$cabecera变量,类型指定为actas_regulares_insert_input!,保留$detalle变量。 - 调整Mutation内部的对象赋值:直接展开
$cabecera,然后单独添加关联的detalle_acta_regulares部分(因为这部分是关联表数据,不属于主表的插入输入类型)。 - 重构变量结构:把原来的零散表头字段全部放到
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
相关产品推荐
相关产品推荐

