Remix/Prisma中多对多关系插入问题求助
解决Prisma多对多关联创建文章时的TypeScript错误
错误原因分析
- 必填字段缺失:中间表
TagsOnPosts的assignedBy字段无默认值,属于必填项,创建中间表记录时必须提供该值。 - 错误字段传入:原代码中
tagsCreate里的name字段属于Tag模型,并非中间表字段,属于冗余错误输入。 - Post关联缺失:
Post模型要求必须关联User,原创建代码未传入userId,违反模型约束。
修正后的实现代码
export async function createPost( post: Pick<Post, "slug" | "title" | "markdown" | "postImageUrl">, tags: string[], userId: string // 传入当前用户ID,用于填充assignedBy字段 ) { const tagsCreate = tags.map((tag) => ({ assignedBy: userId, // 补充中间表必填的assignedBy字段 tag: { connectOrCreate: { where: { name: tag }, create: { name: tag }, }, }, })); return prisma.post.create({ data: { ...post, userId, // 关联当前用户,满足Post模型的必填约束 tags: { create: tagsCreate, }, }, }); }
代码说明
connectOrCreate逻辑:针对每个标签,若数据库中已存在同名标签则直接关联到当前文章;若不存在则创建新标签并完成关联,完全匹配你要求的"自动创建不存在的标签、关联已存在标签"的需求。- 中间表必填项处理:通过传入的
userId填充assignedBy字段,满足TagsOnPosts模型的必填要求。 - 简化字段赋值:使用扩展运算符
...post简化Post基础字段的赋值,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Ms01
相关产品推荐
相关产品推荐

