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

使用Apollo useQuery时,能否通过嵌套变量查询指定客户的项目?

问题描述

我基于GraphQL开发了一个MERN应用,想通过数据中的嵌套属性作为变量查询项目。现有client(客户)和project(项目)模型,希望在使用useQuery查询项目时,传入客户ID获取该客户的所有项目。客户ID(clientId)可通过URL参数获取,目前变量设置有问题,想确认需求是否可实现及正确做法。


解决方案

当然可以实现这个需求,需要从后端GraphQL查询Schema、前端GraphQL查询语句和组件变量传递三个部分修改:

1. 修改后端项目查询Schema,支持接收客户ID参数

当前的projects查询仅返回所有项目,需修改定义让它能接收clientId参数,并在resolve函数中过滤对应项目:

projects: {
  type: new GraphQLList(ProjectType),
  // 添加参数定义
  args: {
    clientId: { type: GraphQLID }
  },
  resolve(parent, args) {
    // 传入clientId时过滤该客户的项目,否则返回全部
    if (args.clientId) {
      return Project.find({ clientId: args.clientId });
    }
    return Project.find();
  },
},

2. 修改前端GraphQL查询语句,添加变量占位符

原查询未接收变量,需修改为带参数的查询,指定接收$clientId变量:

import { gql } from "@apollo/client";

const GET_PROJECTS = gql`
  query getProjects($clientId: ID) {
    projects(clientId: $clientId) {
      id
      title
      client {
        id
        firstName
        lastName
      }
    }
  }
`;

3. 在组件中正确传递变量

直接将URL中获取的clientId作为变量传入useQuery即可,无需嵌套结构:

export const ClientProjects = () => {
  const { clientId } = useParams();

  const { loading, error, data } = useQuery(GET_PROJECTS, {
    variables: { clientId },
  });

  if (loading) return <p>Loading...</p>;
  if (error) return <p>There was an error...</p>;

  return (
    <>
      {data.projects.map((project) => (
        <ProjectCard key={project.id} project={project} />
      ))}
    </>
  );
};

补充说明

从你的项目Schema可见,Project模型实际存储的是clientId(client字段的resolve函数通过parent.clientId查询客户数据),因此后端过滤时直接匹配clientId字段即可,无需处理嵌套的client.id结构。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:22:44