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

使用Prisma嵌套创建Workout关联Exercise时查询关联数据返回undefined问题求助

问题排查与解决

你的代码逻辑和Schema其实没有本质问题,问题出在Prisma默认不会自动返回/加载关联数据,这是新手使用Prisma时很容易踩的坑。我帮你拆解两个关键原因,以及对应的修复方案:

1. 创建Workout时看不到Exercises,不代表它们没被创建

Prisma的create方法默认只会返回当前模型(这里是Workout)的基础字段,不会自动附带关联的Exercises数据。但实际上你的嵌套创建逻辑是生效的,Exercises已经被存入数据库了,只是没在返回结果里显示而已。

2. 查询Workout时未明确指定加载关联数据

你用findUnique查询Workout时,没有告诉Prisma要同时获取关联的exercises列表,所以workout.exercises自然是undefined。Prisma遵循“显式加载关联”的原则,必须手动指定要包含的关联关系。


修改后的测试脚本

const { PrismaClient } = require("@prisma/client")
const prisma = new PrismaClient()

async function main() {
  // 创建Workout时,通过include指定返回关联的exercises
  const newWorkout = await prisma.workout.create({
    data: {
      category: 'Push',
      exercises: {
        create: [
          { name: "pushup", numSets: 5 },
          { name: "headstand", numSets: 3, holdTime: 30 }
        ]
      }
    },
    include: { exercises: true } // 关键:添加这行,返回关联的练习
  })
  console.log("创建的Workout(含练习):", newWorkout)

  // 查询Workout时,同样用include加载exercises
  const workout = await prisma.workout.findUnique({
    where: { id: newWorkout.id }, // 改用刚创建的id,避免硬编码1可能出错
    include: { exercises: true } // 关键:添加这行
  })
  console.log("查询到的Workout练习列表:", workout.exercises)
}

main()
  .catch(e => { throw e })
  .finally(async () => {
    await prisma.$disconnect()
  })

额外验证(可选)

如果你还是担心Exercises没被创建,可以在main函数里加一行查询所有Exercise的代码,直接确认数据存在:

const allExercises = await prisma.exercise.findMany()
console.log("所有练习数据:", allExercises)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:04:09