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

如何在Prisma中创建一对一关系而非一对多关系

解决Prisma中Order与OrderDetail的一对一关系配置问题

要在Order和OrderDetail之间建立严格的一对一关系,需要调整模型的约束和关系配置,以下是正确的实现方式:

基础一对一模型配置

model OrderDetail {
    id          String   @id @default(cuid())
    orderId     String   @unique // 核心约束:确保一个订单仅对应一条详情
    address     String
    city        String
    country     String
    postalCode  String
    phone       String
    createdAt   DateTime @default(now())
    updatedAt   DateTime @updatedAt
    order       Order    @relation(fields: [orderId], references: [id])
}

model Order {
    id          String       @id @default(cuid())
    createdAt   DateTime     @default(now())
    updatedAt   DateTime     @updatedAt
    user        User         @relation(fields: [userId], references: [id], onDelete: Cascade)
    userId      String
    orderItems  OrderItem[]
    orderDetails OrderDetail? // 一对一关系:移除数组,设为可选类型
}

关键修改说明

  • 给OrderDetail的orderId加@unique:数据库层面强制一个orderId只能关联一条OrderDetail记录,从根源避免一对多的情况。
  • 移除OrderDetail中order字段的onDelete配置:一对一关系中,级联操作(如删除、更新)必须配置在关系的反向端(即Order的orderDetails字段),不能放在子端(OrderDetail的order字段)。
  • 将Order的orderDetails改为OrderDetail?:数据库无法强制Order必须关联OrderDetail(除非业务上明确要求,但通常允许先创建订单再补充详情),所以要设为可选类型。若业务要求必须关联,可通过代码逻辑校验,而非数据库约束。

可选:添加级联删除

如果需要实现「删除Order时自动删除对应的OrderDetail」,将onDelete: Cascade配置在Order的orderDetails字段即可:

model Order {
    id          String       @id @default(cuid())
    createdAt   DateTime     @default(now())
    updatedAt   DateTime     @updatedAt
    user        User         @relation(fields: [userId], references: [id], onDelete: Cascade)
    userId      String
    orderItems  OrderItem[]
    orderDetails OrderDetail? @relation(onDelete: Cascade) // 配置级联删除
}

model OrderDetail {
    id          String   @id @default(cuid())
    orderId     String   @unique
    address     String
    city        String
    country     String
    postalCode  String
    phone       String
    createdAt   DateTime @default(now())
    updatedAt   DateTime @updatedAt
    order       Order    @relation(fields: [orderId], references: [id])
}

内容的提问来源于stack exchange,提问作者Fer Toasted

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:55:16