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

