Hasura:如何在插入时与现有记录(很多)建立关系?

时间:2020-05-29 06:49:53

标签: graphql hasura

Hasura:如何在插入时与现有记录(很多对很多)建立关系?

我有两个表:产品和类别,它们基于每个表中的id列和中间表product_category以多对多关系相互链接。

我可以将记录直接插入到两个表的postgres中,并将它们与product_category链接起来,这在Hasura中进行查询非常有用,所以我知道我已经正确设置了。

我想做的是插入一个新产品,并知道我想在插入时建立关系的一个或多个类别的ID。最好不要单独打电话

https://hasura.io/docs/1.0/graphql/manual/mutations/insert.html#insert-an-object-along-with-its-related-objects-through-relationships

文档仅涉及同时插入对象和相关对象,但是如果另一个对象已经存在怎么办?

我尝试了预期的工作方式(将此产品链接到ID为1的类别):

mutation MyMutation {
  insert_product_one(
    object: {
      name: "Champion", 
      category: {data: {id: 1}}
    }) {
    id
  }
}

但是抛出:

“违反非NULL。\“ product_id \”列中的空值违反了非空约束”

如何插入此新产品并将其链接到一个或多个类别?最好只用一个语句,甚至是检索生成的id和update突变的示例都不是理想的,但仍然是一种解决方案。

更新:作为一个健全性检查,我重新创建了产品和类别表作为一个最小的基本示例,并尝试了我的查询和xadm建议的upsert冲突方法。

数据和关系我在此处添加了一些屏幕截图:

https://imgur.com/a/GUomMbe

mutation MyMutation {
  insert_testproduct_one(
    object: {
      name: "Champion", 
      category: {
          data: {id: 1},
          on_conflict: { constraint: primarykeything , update_columns: [id] }
    }
    }) {
    id
  }
}

错误类似:“非空冲突。\“ testcategory_id \”列中的空值违反了非空约束“

注意:primarykeything是桥接表上的由两个ID组成的主键。

1 个答案:

答案 0 :(得分:1)

由于这是多对多关系,因此它们之间有一个联接表。从屏幕快照中可以看到,您在类别关系中发布的类别ID称为testcategory_id,而不是id

mutation MyMutation {
  insert_testproduct_one(
    object: {
      name: "Champion", 
      category: {
          data: {testcategory_id: 1}
    }
    }) {
    id
  }
}

要使其正常工作,表testproduct_testcategory中的ID必须自动递增