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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:47:23