Prisma单表自关联实现评论回复报错排查与解决
Prisma单表自关联实现评论回复时传入parent字段报错的解决方法
问题场景
开发基础聊天系统的评论回复功能,尝试通过Prisma单表自关联实现评论树结构,创建无父级的根评论正常,但创建回复时传入parent参数触发报错。
定义的shoutMessage模型
model shoutMessage { id String @id @default(cuid()) createdAt DateTime @default(now()) message String authorId String type Int parent String? like Int @default(0) author User @relation(fields: [authorId], references: [id], onDelete: Cascade) likes tb_pbot_shout[] root shoutMessage? @relation("replied", fields: [parent], references: [id], onDelete: Cascade) replies shoutMessage[] @relation("replied") }
错误详情
创建回复时传入parent参数,触发如下错误:
Invalid `prisma.shoutMessage.create()` invocation: { data: { author: { connect: { id: "cltna90na0002r4wz7dktapnp" } }, message: "<p>asdasdasdasdasd</p>", parent: "cltw3r6uy0001md3c0lrnfbla", ~~~~~~ type: 1, ? id?: String, ? createdAt?: DateTime, ? like?: Int, ? likes?: tb_pbot_shoutCreateNestedManyWithoutShoutInput, ? root?: shoutMessageCreateNestedOneWithoutReplyInput, ? reply?: shoutMessageCreateNestedManyWithoutRootInput } } Unknown argument `parent`. Available options are marked with ?. at async replyShout (./app/chat2/_lib/process.tsx:272:22) at async $$ACTION_2 (./app/chat2/page.tsx:173:5) digest: "1873872561"
原因分析
parent是Prisma关联关系对应的底层数据库字段,Prisma不允许直接在CRUD操作中传入这类字段,必须通过定义的关联字段(此处为root)来完成关联操作,Prisma会自动处理parent字段的赋值。
解决方法
创建回复时,通过root字段的connect方法关联父评论ID,正确代码如下:
let newComment = await prisma.shoutMessage.create({ data: { author: { connect: { id: user?.id } }, message: message, root: { connect: { id: messageId } }, type: type, }, });
评论树查询示例
查询时可直接通过replies字段获取子评论,实现评论树结构:
const shouts = prisma.shoutMessage.findMany({ select: { id: true, message: true, author: { select: { id: true, name: true } }, replies: { select: { id: true, message: true, author: { select: { id: true, name: true } } } } } });
内容的提问来源于stack exchange,提问作者Radium Chris
相关产品推荐
相关产品推荐

