Hasura:如何在插入时与现有记录(很多对很多)建立关系?
我有两个表:产品和类别,它们基于每个表中的id列和中间表product_category以多对多关系相互链接。
我可以将记录直接插入到两个表的postgres中,并将它们与product_category链接起来,这在Hasura中进行查询非常有用,所以我知道我已经正确设置了。
我想做的是插入一个新产品,并知道我想在插入时建立关系的一个或多个类别的ID。最好不要单独打电话
文档仅涉及同时插入对象和相关对象,但是如果另一个对象已经存在怎么办?
我尝试了预期的工作方式(将此产品链接到ID为1的类别):
mutation MyMutation {
insert_product_one(
object: {
name: "Champion",
category: {data: {id: 1}}
}) {
id
}
}
但是抛出:
“违反非NULL。\“ product_id \”列中的空值违反了非空约束”
如何插入此新产品并将其链接到一个或多个类别?最好只用一个语句,甚至是检索生成的id和update突变的示例都不是理想的,但仍然是一种解决方案。
更新:作为一个健全性检查,我重新创建了产品和类别表作为一个最小的基本示例,并尝试了我的查询和xadm建议的upsert冲突方法。
数据和关系我在此处添加了一些屏幕截图:
mutation MyMutation {
insert_testproduct_one(
object: {
name: "Champion",
category: {
data: {id: 1},
on_conflict: { constraint: primarykeything , update_columns: [id] }
}
}) {
id
}
}
错误类似:“非空冲突。\“ testcategory_id \”列中的空值违反了非空约束“
注意:primarykeything是桥接表上的由两个ID组成的主键。
答案 0 :(得分:1)
由于这是多对多关系,因此它们之间有一个联接表。从屏幕快照中可以看到,您在类别关系中发布的类别ID称为testcategory_id
,而不是id
。
mutation MyMutation {
insert_testproduct_one(
object: {
name: "Champion",
category: {
data: {testcategory_id: 1}
}
}) {
id
}
}
要使其正常工作,表testproduct_testcategory中的ID必须自动递增