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
相关产品推荐
相关产品推荐

