如何在NestJS/Prisma中实现复合主键的Answer表更新函数?
解决复合主键Answer表的更新问题
你的核心问题在于Answer表使用的是复合主键(id_question + id_user),而非单一自增ID,所以不能用传统的单一:id参数定位要更新的记录,必须同时传入两个主键字段的值。下面是完整的修正方案:
1. 修正Controller路由与参数处理
修改路由以同时接收id_question和id_user两个参数,并从请求体中获取要更新的内容:
import { Body, Controller, Patch, Param } from '@nestjs/common'; import { AnswerService } from './answers.service'; import { Answer } from '@prisma/client'; @Controller('answers') export class AnswerController { constructor(private readonly answerService: AnswerService) {} @Patch(':idQuestion/:idUser') async updateAnswer( @Param('idQuestion') idQuestion: string, @Param('idUser') idUser: string, @Body() updateData: { content: string }, ): Promise<Answer> { return this.answerService.updateAnswer({ where: { // 复合主键查询:直接传入两个主键字段定位唯一记录 id_question: parseInt(idQuestion), id_user: idUser, }, data: { content: updateData.content, // updated_at由Prisma自动维护,无需手动传入 }, }); } }
关键细节:
- 路由设计:通过
:idQuestion/:idUser传递两个主键参数,确保唯一匹配一条Answer记录 - 请求体:用
@Body()接收前端传来的实际更新内容,替代原代码中硬编码的content: true(类型错误,content为字符串) - Where条件:复合主键的唯一查询需同时指定两个字段值,Prisma会自动匹配对应的复合主键约束
2. 确认Service层代码有效性
你的answers.service.ts代码本身逻辑正确,只要传入的where参数符合复合主键查询规则即可,无需修改:
async updateAnswer(params: { where: Prisma.AnswerWhereUniqueInput; data: Prisma.AnswerUpdateInput; }): Promise<Answer> { const { where, data } = params; return this.prisma.answer.update({ data, where, }); }
3. 前端请求示例
更新时需同时携带两个主键参数和更新内容,示例如下:
// 假设问题ID为101,用户ID为"user_789" axios.patch('/answers/101/user_789', { content: '这是更新后的回答内容' });
内容的提问来源于stack exchange,提问作者louih0
相关产品推荐
相关产品推荐

