如何在Hasura(基于PostgreSQL)中编写满足双向匹配条件的GraphQL删除Mutation
解决Hasura中删除双向关联行的Mutation编写问题
我明白你的困扰——刚接触GraphQL和Hasura时,很容易在复杂逻辑条件的语法上踩坑。你想要删除双向的关联行(比如(2,9)和(9,2)),核心逻辑是对的,但你的Mutation语法结构有问题,主要是_or和_and的嵌套格式不对。
问题出在哪里?
你原来的写法中,_or后面没有用数组包裹多个条件,而且_and的结构也缺少正确的层级。Hasura的逻辑运算符(_or/_and)需要接受一个条件数组,每个数组元素是一组过滤规则。
正确的Mutation写法
针对你的需求,正确的delete_links Mutation应该这样写:
mutation DeleteBidirectionalLinks($a: Int!, $b: Int!) { delete_links( where: { _or: [ {_and: [{link_a: {_eq: $a}}, {link_b: {_eq: $b}}]}, {_and: [{link_a: {_eq: $b}}, {link_b: {_eq: $a}}]} ] } ) { affected_rows } }
关键细节解释:
- 使用变量(
$a和$b)代替硬编码值,这样Mutation更通用,也符合GraphQL的最佳实践。如果你的场景不需要变量,直接替换成具体数值(比如2和9)也可以。 _or接受一个数组,数组里的两个元素分别对应你需求中的两个分支条件:- 第一个
_and条件:link_a = $a且link_b = $b - 第二个
_and条件:link_a = $b且link_b = $a
- 第一个
- Hasura会自动解析这个逻辑,同时匹配两种方向的关联行并删除。
测试示例
如果要删除link_a和link_b为2和9的双向关联,执行Mutation时传入变量:
{ "a": 2, "b": 9 }
执行后,表中(2,9)和(9,2)的两行都会被删除,affected_rows会返回2(如果两行都存在的话)。
额外小提示
如果你的业务逻辑中经常需要处理这种双向关联,可以考虑在Hasura中创建一个视图或者添加一个计算字段,比如生成一个标准化的关联键(比如把link_a和link_b按从小到大排序后拼接),这样后续查询或删除时可以用更简单的条件过滤,减少重复编写复杂逻辑的麻烦。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

