【问题标题】:Hasura: How to establish relationship to existing record (many to many) at insert time?Hasura:如何在插入时建立与现有记录(多对多)的关系?
【发布时间】:2020-09-16 16:26:16
【问题描述】:

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

我有两个表:product 和 category,它们基于每个表中的 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
  }
}

但这会引发:

“非空违规。“product_id”列中的空值违反非空约束”

如何插入此新产品并将其链接到一个或多个类别?最好全部在一个语句中,但即使是检索生成的 id 和更新突变的示例也不理想,但也不是一个解决方案。

更新:作为健全性检查,我重新创建了产品和类别表作为最小的基本示例,并尝试了我的查询和 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
  }
}

错误类似:“Not-NULL 违规。“testcategory_id”列中的空值违反了非空约束”

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

【问题讨论】:

  • 恕我直言,这在您提供的文档中进行了描述-您需要提供整个嵌套数据(类别,请提前阅读)并使用on_conflict
  • @xadm 所以你说你尝试插入嵌套数据的副本,而 on_conflict 处理更新?我确实尝试过,但还没有成功。尝试使用它时基本上会引发相同的错误。 ``` on_conflict: { 约束: product_pkey , update_columns: [id] } ```
  • 我不使用它,我阅读了这个文档,恕我直言,它应该可以这样工作......搜索问题并最终打开一个提供最小示例的问题 - 看起来反向关系失败了?
  • 你能发布你的表格结构吗?不知道结构很难知道问题出在哪里。
  • @LeonardoAlves 添加了一些来自 Hasura 的结构截图,并根据 xadm 添加的内容进行了更新。

标签: graphql hasura


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!这样可行!我也能理解它为什么起作用。现在我已经看到它工作了。关系名称是类别,但这本质上是桥接表的“视图”。不是很直观,但我现在明白了。
猜你喜欢
  • 2022-01-27
  • 2014-09-16
  • 2012-11-23
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
相关资源
最近更新 更多