【发布时间】:2020-09-16 16:26:16
【问题描述】:
Hasura:如何在插入时建立与现有记录的关系(多对多)?
我有两个表:product 和 category,它们基于每个表中的 id 列和中间表 product_category 以多对多关系相互链接。
我可以将记录直接插入到两个表的 postgres 中,并将它们与 product_category 链接,这在 Hasura 中非常适用于查询,所以我知道我已经正确设置了。
我想要做的是插入一个新产品并知道我想在插入时建立关系的一个(或多个)类别的 ID。最好不要单独调用
文档只涉及同时插入对象和相关对象,但如果另一个已经存在怎么办?
我已经尝试了我期望的工作(将此产品链接到 id 为 1 的类别):
mutation MyMutation {
insert_product_one(
object: {
name: "Champion",
category: {data: {id: 1}}
}) {
id
}
}
但这会引发:
“非空违规。“product_id”列中的空值违反非空约束”
如何插入此新产品并将其链接到一个或多个类别?最好全部在一个语句中,但即使是检索生成的 id 和更新突变的示例也不理想,但也不是一个解决方案。
更新:作为健全性检查,我重新创建了产品和类别表作为最小的基本示例,并尝试了我的查询和 xadm 建议的 upsert 冲突方法。
我在这里添加了一些截图的数据和关系:
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 添加的内容进行了更新。