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

使用Prisma findMany()查询显式多对多关联数据遇阻

如何在Prisma中查询显式多对多关系的学生及关联班级数据

你的显式多对多模型配置是正确的,当前的查询语句其实已经能满足需求,下面详细说明用法和优化方式:

现有查询的有效性

你写的这段代码已经可以加载学生、关联的中间表记录,以及对应的班级信息:

const siswa = await prisma.student.findMany({
  include: {
    class: {
      include: {
        class: true
      }
    }
  }
});
  • 外层的include: { class: ... }:加载Student模型中关联的class字段(即classStudent中间表的所有关联记录)
  • 内层的include: { class: true }:加载每个中间表记录对应的Class实体数据

返回的结构会和你期望的几乎一致(仅多了中间表的id字段,你示例里的teacherId在当前模型中不存在,属于笔误):

[
  {
    "id": 1,
    "name": "John Doe",
    "class": [
      {
        "id": 1,
        "studentId": 1,
        "classId": 2,
        "class": {
          "id": 2,
          "name": "Science"
        }
      }
    ]
  }
]

精准控制返回字段(可选)

如果想去掉中间表的id字段,或者只返回特定字段,可以用select替代include来精准筛选:

const siswa = await prisma.student.findMany({
  select: {
    id: true,
    name: true,
    class: {
      select: {
        studentId: true,
        classId: true,
        class: {
          select: {
            id: true,
            name: true
          }
        }
      }
    }
  }
});

这样返回的结构就完全匹配你给出的示例格式了。

显式多对多的查询逻辑说明

因为你使用了显式多对多(手动定义中间表classStudent),而非Prisma自动生成的隐式多对多,所以查询时必须通过中间表来关联两端的模型。这种方式的优势是可以给中间表添加自定义字段(比如入学时间、成绩等),后续扩展时直接在中间表模型加字段即可,查询时也能一并加载这些自定义字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:24:57