如何在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
相关产品推荐
相关产品推荐

