使用Prisma创建Quiz元素时遇类型错误,求解决方案
问题分析与解决
你的类型错误核心原因是Quiz模型中playedById被定义为必填字段,但创建测验时未提供该值;更关键的是当前Prisma Schema的关联设计不符合“一个测验可被多个用户参与”的业务逻辑——你将playedBy设为了一对一关联,但实际场景下一个测验应该允许多个用户参与。
步骤1:修正Prisma Schema关联设计
通过已有的Play模型来记录用户参与测验的关系,删除Quiz模型中多余的直接关联字段。修改后的Schema如下:
// This is your Prisma schema file generator client { provider = "prisma-client-js" } datasource db { provider = "mysql" url = env("DATABASE_URL") } model User { id String @id @default(uuid()) name String @unique userQuizzes Quiz[] @relation("author") plays Play[] // 通过Play模型关联参与的测验 @@map("users") } model Quiz { id String @id @default(uuid()) author User @relation("author" ,fields: [authorId], references: [id]) title String description String @db.LongText times_played Int @default(0) authorId String questions Question[] plays Play[] // 通过Play模型关联参与的用户 @@map("challanges") } model Question { id String @id @default(uuid()) question String @db.LongText answer String quiz Quiz @relation(fields: [quizId], references: [id]) quizId String @@map("questions") } model Play { id String @id @default(uuid()) player User @relation(fields: [playerId], references: [id]) playerId String result Float quiz Quiz @relation(fields: [quizId], references: [id]) quizId String @@map("plays") }
解释:原有的playedQuizzes直接关联属于冗余设计,Play模型已经通过playerId和quizId记录了用户与测验的参与关系,完全可以通过该模型查询用户参与过的所有测验。
步骤2:调整创建测验的代码
修正Schema后,创建测验时无需再提供playedById,原有代码可正常运行(注意接口中genre字段未被使用,可根据需求补充到Quiz模型或删除):
import { prisma } from "../../../prisma/client"; interface createChallangeType { userId: string title: string genre: string description: string } export class createChallangeUseCase { async execute({userId, title, description}: createChallangeType) { try { const newChallange = await prisma.user.update({ where: { id: userId }, data: { userQuizzes: { create: { title: title, description: description } } }, // 可选:若需返回创建的测验数据,添加include include: { userQuizzes: true } }) return newChallange } catch (error) { return error } } }
备选方案(不推荐)
若坚持保留用户与测验的直接关联,可将playedById设为可选字段,但此设计仅支持记录单个参与用户,不符合多用户参与的业务需求:
model Quiz { // ...其他字段 playedById String? // 添加问号设为可选 playedBy User? @relation("playedQuizzes",fields: [playedById], references: [id]) }
内容的提问来源于stack exchange,提问作者Eduard Wild
相关产品推荐
相关产品推荐

