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

Prisma如何通过单次查询获取间接关联关系的数据?

Prisma 查询嵌套结构需求问题

我刚开始使用Prisma,为一个训练营项目构建了对应的Schema(目前运行正常)。我已经能处理简单Prisma CRUD操作中的关联关系与嵌套字段,但现在尝试通过单次prisma.term.findMany调用获取如下结构的数据:

data = {
    terms: [{id, name, 
        disciplines: [{id, name, 
            categories: [{id, name, 
                tests: [{id, name, pdfUrl, teacher}]
            }]
        }]
    }]
}

目前我只能通过terms > disciplines > disciplines teachers > tests > categories的关联路径获取数据,再通过另一个函数重构对象得到期望结构。但Schema中disciplines和categories无直接关联,请问能否通过select/include实现单次查询获取该数据?


结论

没办法直接通过Prisma的select/include实现单次查询得到你要的结构。因为Prisma的嵌套查询严格依赖Schema中定义的关联关系,既然disciplines和categories没有直接关联,就没法在disciplines的层级直接嵌套查询categories。

可行方案

  • 查询后数据重构:这是你目前在用的方案,也是最直接易维护的方式。先按现有关联路径把所有需要的数据查出来,再用JavaScript数组方法重组结构。示例代码如下:
const rawData = await prisma.term.findMany({
  include: {
    disciplines: {
      include: {
        disciplines_teachers: {
          include: {
            tests: {
              include: {
                categories: true
              }
            }
          }
        }
      }
    }
  }
});

// 重构为目标结构
const formattedData = {
  terms: rawData.map(term => ({
    id: term.id,
    name: term.name,
    disciplines: term.disciplines.map(discipline => {
      // 收集该科目下所有关联的分类及对应测试
      const categoryMap = new Map();
      discipline.disciplines_teachers.forEach(dt => {
        dt.tests.forEach(test => {
          test.categories.forEach(category => {
            if (!categoryMap.has(category.id)) {
              categoryMap.set(category.id, {
                ...category,
                tests: []
              });
            }
            categoryMap.get(category.id).tests.push({
              id: test.id,
              name: test.name,
              pdfUrl: test.pdfUrl,
              teacher: dt.teacher // 从关联的教师表取信息
            });
          });
        });
      });
      return {
        id: discipline.id,
        name: discipline.name,
        categories: Array.from(categoryMap.values())
      };
    })
  }))
};
  • 使用原生SQL查询:如果不想在代码层处理数据,可以用prisma.$queryRaw编写原生SQL,通过多表JOIN直接拼接出目标结构。这种方式需要熟悉数据库JOIN语法,灵活度高,但可读性和维护性不如ORM查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:54:20