You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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接受一个数组,数组里的两个元素分别对应你需求中的两个分支条件:
    1. 第一个_and条件:link_a = $a 且 link_b = $b
    2. 第二个_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:17:44