如何在Hasura GraphQL查询中同时使用_and与_or运算符?
Hasura GraphQL 组合 _and/_or 查询无结果问题解决
问题分析
你的查询语法本身符合Hasura规范,无结果的核心原因大概率是逻辑条件设置过严或无同时满足所有条件的数据,而非语法疏漏:
- 当前查询逻辑是:
(标题含关键词 OR 地点含关键词) AND (事件开始≥筛选起始) AND (事件结束≤筛选结束) - 这个逻辑要求事件完全落在你指定的时间区间内,如果目标事件跨区间(比如起始早于筛选起始、结束晚于筛选结束),就会被排除。而单独使用时间条件时,你可能查询的是部分落在区间的事件;单独使用搜索条件时查询的是所有含关键词的事件,两者交集为空导致组合查询无结果。
解决方案
1. 修正时间范围逻辑(日历场景常用)
如果需求是筛选与指定时间范围有交集的事件(只要事件和筛选区间有重叠就显示),时间条件需调整为:
{ start_date_time_utc: {_lte: "筛选结束时间"}, end_date_time_utc: {_gte: "筛选开始时间"} }
这个逻辑的含义是:事件的开始时间不晚于筛选结束时间,且事件的结束时间不早于筛选开始时间,覆盖所有与区间有交集的情况。
2. 排查数据交集
如果坚持原时间逻辑,按以下步骤排查:
- 单独运行时间条件的
_and查询,导出符合时间范围的事件列表 - 单独运行关键词筛选的
_or查询,导出符合搜索条件的事件列表 - 检查两个列表是否有交集,若无交集则说明无同时满足条件的数据,需调整筛选参数
- 若有交集但组合查询无结果,检查Hasura的行级权限设置,是否存在权限规则限制了同时满足两类条件的事件访问
3. 优化为动态变量查询(适配筛选面板)
为了更方便动态接收筛选面板的输入,建议改用变量查询,避免硬编码值:
query FilterEvents($searchTerm: String!, $startDate: timestamptz!, $endDate: timestamptz!) { events(where: { _and: [ { _or: [ { title: {_ilike: $searchTerm} }, { location: {_ilike: $searchTerm} } ] }, { start_date_time_utc: {_lte: $endDate} }, { end_date_time_utc: {_gte: $startDate} } ] }) { id title start_date_time_utc end_date_time_utc } }
调用时传入变量示例:
{ "searchTerm": "%test%", "startDate": "2024-01-08T04:05:06.605+00:00", "endDate": "2024-02-28T21:52:09+00:00" }
内容的提问来源于stack exchange,提问作者skrtz
相关产品推荐
相关产品推荐

