Prisma:在显式多对多关系中创建或连接记录

Posted

技术标签:

【中文标题】Prisma:在显式多对多关系中创建或连接记录【英文标题】:Prisma: Create or Connect Records in Explicit Many-to-Many Relations 【发布时间】:2021-07-25 11:58:20 【问题描述】:

在我的 Prisma Schema 中,我发现很难理解如何在显式多对多关系的情况下创建记录。

我有以下架构。基本上它代表书籍列表。用户可以创建书籍列表。

用户可以创建一个新列表,然后将书籍连同他们自己的笔记一起添加到该列表中。图书模型是纯粹的,包含标准图书信息。

需要额外的模型,因为将图书添加到列表中的用户可以添加自己的关于图书的注释。

    model List 
      id        Int     @default(autoincrement()) @id
      title     String
      slug      String?
      content   String?
      published Boolean @default(false)
      author    User?   @relation(fields: [authorId], references: [id])
      authorId  Int?
      books     BooksInLists[]
      createdAt DateTime @default(now())
      updatedAt DateTime @updatedAt
    
    
    model BooksInLists 
      list        List     @relation(fields: [listId], references: [id])
      listId      Int      // relation scalar field (used in the `@relation` attribute above)
      book    Book @relation(fields: [bookId], references: [id])
      bookId  Int      // relation scalar field (used in the `@relation` attribute above)
      @@id([listId, bookId])
      adder    User?   @relation(fields: [adderId], references: [id])
      adderId  Int?
      notes   String?
    
    
    model Book 
      id     Int     @id @default(autoincrement())
      name   String
      lists  BooksInLists[]
      curator    User?   @relation(fields: [curatorId], references: [id])
      curatorId  Int?
      bookDescription  String?
    
    
    model User 
      id            Int       @default(autoincrement()) @id
      name          String?
      email         String?   @unique
      lists         List[]
      books         Book[]
      booksinlists  BooksInLists[]
    
      @@map(name: "users")
    

我希望能够执行的查询。

在更新列表时,我应该能够将新书添加到列表中。这应该会创建新书,并且还允许我在 BooksInLists 模型中添加新记录以及“notes”字段。

在更新列表时,我应该能够将现有书籍添加/连接到列表中。这将允许我在 BooksInLists 模型中添加一条新记录以及“notes”字段。

【问题讨论】:

【参考方案1】:

会是这样的:

    prisma.booksInLists.create(
        data: 
          list: 
            connect: 
              id: 99
            ,
          ,
          book: 
            create: 
              name: 'Young Lions'
            
          
        
      )

但是,我发现数据库架构存在缺陷。模型BooksInLists 连接BooksList,因此您不需要adder 关系。反过来,在Book 模型中,您不应该添加curator 关系,因为它是多对多关系。您必须使用连接表usersBooks 连接UserBook 表。

【讨论】:

谢谢。那是因为图书添加者和图书策展人可以不同。

以上是关于Prisma:在显式多对多关系中创建或连接记录的主要内容,如果未能解决你的问题,请参考以下文章

更新 Prisma 中的多对多关系

Apollo 和 Prisma Graphql 显式模型关系不可查询

Prisma 多对多关系查询

使用 Prisma 通过关联表查询多对多关系

Prisma 删除与复合键的多对多关系

如何利用 Prisma 的隐式关系来创建以下关系? (一对多,多对多,一对一)