如何在Prisma中通过同一字段建立日志表与多表的关联?
解决方案
针对你的需求,我们可以用Prisma的判别式关联来实现日志表与员工、供应商表的关联,同时修正字段类型匹配问题,具体配置如下:
调整后的Prisma模型
model Log { id Int @id @default(autoincrement()) deleteId Int // 改为Int,匹配员工/供应商的主键类型,移除@unique(不同类型的记录可能有相同ID) type String // 用于区分记录类型,取值为"Employee"或"Vendor"(对应模型名称) employee Employee? @relation("EmployeeLog", fields: [deleteId, type], references: [id, __typename]) vendor Vendor? @relation("VendorLog", fields: [deleteId, type], references: [id, __typename]) } model Employee { id Int @id @default(autoincrement()) name String? @unique logs Log[] @relation("EmployeeLog") } model Vendor { id Int @id @default(autoincrement()) name String? @unique logs Log[] @relation("VendorLog") }
核心要点
- 字段类型对齐:把原
delete_id改为deleteId(遵循Prisma命名规范),类型从String改成Int,和员工、供应商的主键类型匹配;去掉@unique约束,因为员工和供应商的主键可能重复(比如员工ID=1和供应商ID=1是不同对象)。 - 判别式关联逻辑:通过
deleteId+type的组合字段关联到对应表,__typename是Prisma自动为模型生成的标识(即Employee/Vendor),所以type字段的值要和模型名称一致,确保关联准确。 - 单向/反向关联:日志表中的
employee和vendor为可选字段(一条日志只对应一个对象),员工、供应商表中的logs字段用于反向查询该对象的所有删除日志。
自定义类型取值的扩展方案
如果你的业务中type字段想用自定义值(比如"employee"小写或"供应商"),可以给员工、供应商表添加固定标识字段来映射:
model Log { id Int @id @default(autoincrement()) deleteId Int type String // 取值为"employee"或"vendor" employee Employee? @relation("EmployeeLog", fields: [deleteId, type], references: [id, logType]) vendor Vendor? @relation("VendorLog", fields: [deleteId, type], references: [id, logType]) } model Employee { id Int @id @default(autoincrement()) name String? @unique logType String @default("employee") // 固定标识,和日志表type字段对应 logs Log[] @relation("EmployeeLog") } model Vendor { id Int @id @default(autoincrement()) name String? @unique logType String @default("vendor") // 固定标识,和日志表type字段对应 logs Log[] @relation("VendorLog") }
内容的提问来源于stack exchange,提问作者code_optimizer
相关产品推荐
相关产品推荐

