MongoDB 的显式多对多关系 Prisma 模式语法

问题描述 投票:0回答:1

以下是我的 3 个模型的 Prisma 架构 --> 用户、购物车和商品。

model User {
  id             String  @id @default(auto()) @map("_id") @db.ObjectId
  name           String
  email          String  @unique
  hashedPassword String
  isAdmin        Boolean @default(false)
  cart           Cart?
}

model Cart {
  id      String   @id @default(auto()) @map("_id") @db.ObjectId

  user    User     @relation(fields: [userId], references: [id])
  userId  String   @unique @db.ObjectId

  itemIDs String[] @db.ObjectId
  items   Item[]   @relation(fields: [itemIDs], references: [id])
}

model Item {
  id           String   @id @default(auto()) @map("_id") @db.ObjectId
  name         String
  category     String?
  description  String?
  color        String?
  price        Float
  listImageUrl String[]

  carts        Cart[]   @relation(fields: [cartIDs], references: [id])
  cartIDs      String[] @db.ObjectId
}

我想为购物车和商品定义一个显式的多对多关系,并添加一个属性,

quantity Int
来跟踪用户在购物车中拥有的商品副本数量。

我尝试这样做:

model CartItem {
    cart   Cart   @relation(fields: [cartId], references: [id])
    cartId String

    item   Item   @relation(fields: [itemId], references: [id])
    itemId String

    quantity Int @default(1)
    
    // *** THIS IS MY PROBLEM ***
    @@id([cartId, itemId]) // But Compound Key's are not supported for MongoDB. 
}

我们在这里能做什么?

我参考了以下 Prisma 文档,但它仅解释了隐式多对多关系的语法。 https://www.prisma.io/docs/orm/prisma-schema/data-model/relations/many-to-many-relations#mongodb

database mongodb database-design schema prisma
1个回答
0
投票

不要将 CartItem 创建为单独的模型,而是将其设为“嵌入文档”。这会将 CartItem 保存为购物车模型中的子文档。您甚至可以将购物车创建为用户模型中的子文档。 model User { id String @id @default(auto()) @map("_id") @db.ObjectId name String email String @unique hashedPassword String isAdmin Boolean @default(false) cart Cart? } model Cart { id String @id @default(auto()) @map("_id") @db.ObjectId user User @relation(fields: [userId], references: [id]) userId String @unique @db.ObjectId items CartItem[] } model Item { id String @id @default(auto()) @map("_id") @db.ObjectId name String category String? description String? color String? price Float listImageUrl String[] carts Cart[] @relation(fields: [cartIDs], references: [id]) cartIDs String[] @db.ObjectId } type CartItem { item Item @relation(fields: [itemId], references: [id]) itemId String quantity Int @default(1) }

© www.soinside.com 2019 - 2024. All rights reserved.