GraphQL查询职位信息时可选参数为空返回空数组问题求助
问题原因
问题出在SQL的三值逻辑特性:当$category、$location、$type传入空值(null)时,你写的slug: {_eq: $xxx}筛选条件会被转换为SQL语句中的slug = NULL。而在SQL规则里,NULL和任何值做相等判断的结果都为UNKNOWN,WHERE子句仅会保留判断结果为TRUE的行,因此没有任何记录符合筛选条件,最终返回空数组。
你移除这三个筛选条件后查询就恢复正常,也验证了就是这三个强制相等的条件在参数为空时过滤了所有结果。
修复方案
你可以根据所用的GraphQL引擎选择对应方案:
- 若使用Hasura等支持动态条件的GraphQL引擎,可将可选参数的筛选逻辑调整为「参数为空时直接跳过该条件」,参考写法如下:
query getJobsSearch( $location: String $type: String $category: String $time: String $limit: Int ) { jobs( order_by: {created_at: desc}, where: { deleted_at: {_is_null: true}, created_at: {_gt: "2021-06-16T10:06:38.551984+00:00"}, _and: [ {_or: [{job_category: {slug: {_eq: $category}}}, {$category: {_is_null: true}}]}, {_or: [{location: {slug: {_eq: $location}}}, {$location: {_is_null: true}}]}, {_or: [{job_type: {slug: {_eq: $type}}}, {$type: {_is_null: true}}]} ] }, limit: $limit )
- 若为自行实现的GraphQL resolver,可在拼接查询条件的逻辑中增加判断:仅当参数不为空时,才将对应的
slug筛选条件加入WHERE子句,避免生成slug = NULL的无效过滤条件。 - 也可以在前端传参层做处理:如果用户没有选择对应筛选项,就不传该参数,同时在GraphQL schema中给参数设置默认值,resolver层识别到默认值时直接跳过对应筛选。
内容的提问来源于stack exchange,提问作者MAYANK KUMAR
相关产品推荐
相关产品推荐

