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

如何在Hasura GraphQL查询中结合变量使用%通配符

解决Hasura GraphQL中_ilike结合变量实现模糊匹配的问题

我之前也踩过这个坑!你遇到的问题是因为直接在_ilike里写%$hash%的话,GraphQL会把它当成一个字面量字符串,而不是把$hash替换成你传入的变量值——相当于你在找包含$hash这几个字符的内容,自然得不到想要的结果。下面给你两种靠谱的解决方法,适配你的JavaScript项目:

方法1:在GraphQL查询中通过字符串拼接构造通配符

Hasura支持用内置的字符串函数_concat来拼接通配符和变量,这样就能让_ilike正确识别变量了。修改你的查询代码如下:

query MyQuery($domain: String!, $hash: String!) {
  hashtags_hashtags(where: {domain: {_eq: $domain}}, limit: 15, offset: 5, order_by: {hashtag: asc}) {
    hashtag
    responses_languages(where: {
      language: {_eq: "english"}, 
      hashtag: {_ilike: _concat('%', $hash, '%')}  # 用_concat拼接%和变量
    }) {
      hashtag
      response
    }
  }
}

这种方法的好处是,模糊匹配的规则(全匹配、前缀匹配、后缀匹配)可以直接在查询里定义——比如要前缀匹配就写成_concat($hash, '%'),后缀匹配写成_concat('%', $hash)。

方法2:在JavaScript端提前给变量加上通配符

如果你想在前端控制通配符的添加逻辑,也可以在传入变量之前,把用户输入的内容和%拼接好,再传给Hasura。示例代码如下:

// 假设userInput是用户输入的关键词,比如"cheese"
const userInput = "cheese";
// 构造带通配符的变量值
const hashVariable = `%${userInput}%`;

// 调用Hasura查询时传入变量
const response = await fetch('你的Hasura GraphQL端点', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    query: `
      query MyQuery($domain: String!, $hash: String!) {
        hashtags_hashtags(where: {domain: {_eq: $domain}}, limit: 15, offset: 5, order_by: {hashtag: asc}) {
          hashtag
          responses_languages(where: {language: {_eq: "english"}, hashtag: {_ilike: $hash}}) {
            hashtag
            response
          }
        }
      }
    `,
    variables: {
      domain: "你的域名变量",
      hash: hashVariable  // 传入已经带%的变量
    }
  })
});

这种方法更灵活,比如你可以根据用户的选择(比如“开头包含”“结尾包含”“任意位置包含”)来动态调整通配符的位置。

为什么原来的写法不生效?

再啰嗦一句:%$hash%在GraphQL的语法里是一个普通字符串,Hasura不会解析其中的$hash变量,所以它会去匹配字段值中**字面包含$hash**的记录,而不是你传入的变量值——这就是为什么直接写%cheese%有用,但用变量就不行的原因。

内容的提问来源于stack exchange,提问作者Mystery Man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:27:40