显式多对多关系棱镜

Posted

技术标签:

【中文标题】显式多对多关系棱镜【英文标题】:Explicit many to many relation prisma 【发布时间】:2021-08-25 21:49:54 【问题描述】:

我有这 3 个棱镜模型,

model user 
  id                        String                 @id @default(cuid())
  createdAt                 DateTime               @default(now())
  updatedAt                 DateTime               @default(now())
  courses                   userOnCourse[]


model course 
  id                      String                         @id @default(cuid())
  createdAt               DateTime                       @default(now())
  updatedAt               DateTime                       @default(now())
  users                   userOnCourse[]
  title                   String
  description             String


model userOnCourse 
  createdAt     DateTime    @default(now())
  user          user        @relation(fields: [userId], references: [id])
  userId        String
  course        Course      @relation(fields: [courseId], references: [id])
  courseId      String

  @@id([userId, courseId])

这是一个多对多的关系,一个用户可以有很多课程,一个课程可以有很多用户,为了引用明确的 m-m 关系,我创建了另一个模型名称 userOnCourse

我正在努力将 courseId 的引用传递到 userOnCourse 模型中,我想将课程与 userid 一起连接到该模型中,但由于它是在运行时创建的,因此似乎无法在编译时传递 courseId。

这里是代码,假设我们在创建课程时已经有用户数据,如何传递已经在运行时创建的 courseId 并建立连接。

我正在关注来自 prisma 文档的 reference。

const createCourse = await prisma.course.create(
            data: 
                title: courseData.title,
                description: courseData.description,
                users: 
                    connect: 
                        userId_courseId: 
                            userId: user.id,
                            courseId: ?? // That is where the problem is, how can i add the coursesId?
                        ,
                    ,
                ,
            ,
        );

【问题讨论】:

【参考方案1】:

您需要的是create 而不是connect。您需要在映射UserCourse 的多对多表中创建一个新条目。所以你需要create那个条目。

代码是:

await prisma.course.create(
    data: 
      description: 'des',
      title: 'title',
      users:  create:  userId: user.id  ,
    ,
)

【讨论】:

谢谢 :) 确实有效。它会自动在所需的数据库中为其创建正确的 id。【参考方案2】:

我有点陷入同样的​​境地,但是上面的答案很有帮助,你能告诉我你是如何设法扭转查询的吗?我的意思是您如何将同一课程明确分配给不同的用户?

【讨论】:

【参考方案3】:

如果您需要分配已经存在的实体:

const response: course = await prisma.course.create(
             data: 
                 ...someOtherData, 
                    userOnCourse:  create: [ user:  connect:  id: 2    ]
                  
            
        );

这很令人困惑,因为它说的是创建,但它意味着创建与现有实体的连接。

【讨论】:

以上是关于显式多对多关系棱镜的主要内容,如果未能解决你的问题,请参考以下文章

多对多关系棱镜

更新 Prisma 中的多对多关系

多对多映射方法有啥区别

两个棱镜模型之间的一对多和可能对多关系

MySQL 基础 -- 多表关系(一对一1对多(多对一)多对多)多表查询(内连接外连接自连接子查询(嵌套查询)联合查询 union)笛卡儿积

具有额外多对多关系的 JPA 多对多