Prisma多对多操作分为隐式(
Implicit many-to-many relations
)和显式(Explicit many-to-many relations
)两种,区别在于隐式关联表真的具有“魔法”,操作简化,Prisma自动帮助处理很多复杂操作。
显式关联表也有其优点,比如可以自定义增加关联表字段(创建关联时间、操作信息等等)。
在显式多对多关系中,关系表在Prisma模式中表示为模型,可用于查询。显式多对多关系定义了三种模型:
- 具有多对多关系的两个模型,如Category和Post
- 表示关系表的一个模型,例如基础数据库中的CategoriesOnPosts(有时也称为联接、链接或透视表)
以下是我无数次试错找到的解决办法
// TODO 显式关系表的更新,先删除后创建
await prisma.book.update({
where: { id: 'cl7d2hp5z00058su3g13sqffg' },
data: {
categories: {
deleteMany: { bookId: 'cl7d2hp5z00058su3g13sqffg' },
create: [
{ category: { connect: { name: '武侠小说' } } },
{ category: { connect: { name: '言情小说' } } },
{ category: { connect: { id: 'cl7d2hp5v00008su3c9k6a5ga' } } }
]
}
}
})
// TODO 通过关联表查(booksOnCategories)找所有数据
const allBooks = await prisma.booksOnCategories.findMany({
select: { category: { select: { name: true } }, book: { select: { title: true } } }
// include: { category: true, book: true }
})
console.log(allBooks)