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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:15:44