GraphQL场景下如何无需查询子字段即可获取子字段ID
实现方案
你可以通过调整GraphQL服务端的Schema和Resolver逻辑实现需求,无需修改客户端查询规则,有两种可选方案:
- 方案一(推荐,符合GraphQL规范):给
User类型新增projectId字段,类型设为ID,对应Resolver直接返回User表中存储的project_id外键值即可,完全不需要查询项目表。 - 方案二(复用
project字段):将project字段设置为支持动态返回类型,无子字段查询时返回ID,有嵌套子字段时返回完整Project对象,Resolver中通过解析查询AST判断是否有子字段请求即可,示例代码(Apollo Server场景)如下:
const userResolvers = { User: { project: (parent, args, context, info) => { // 检测当前project字段是否请求了嵌套子字段 const hasSubFields = info.fieldNodes[0].selectionSet?.selections?.length > 0 if (!hasSubFields) { // 无嵌套查询直接返回外键,无需访问项目表 return parent.project_id } // 有嵌套查询再查项目表返回完整数据 return context.db.Project.findByPk(parent.project_id) } } }
如果你用的是其他GraphQL框架,只要能获取到查询字段的AST信息,都可以用同样的逻辑实现。
内容的提问来源于stack exchange,提问作者cagigas
相关产品推荐
相关产品推荐

