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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:45:34