首页 > 解决方案 > 如何连接多条mn关系记录

问题描述

我有一个看起来像这样的架构:

model School {
  id       Int       @id @default(autoincrement())
  name     String
  teachers Teacher[]
  students Student[]
}

model Teacher {
  id        Int       @id @default(autoincrement())
  firstName String
  lastName  String
  schools   School[]
  students  Student[]
}

model Student {
  id        Int     @id @default(autoincrement())
  firstName String
  lastName  String
  teacherId Int
  teacher   Teacher @relation(fields: [teacherId], references: [id])
  schoolId  Int
  school    School  @relation(fields: [schoolId], references: [id])
}

我想在一个电话中创建一所学校,有老师和学生。这是我的尝试:

prisma.school.create({
    data: {
        name: "Best",
        teachers: {
            create: {
                id: 2,
                firstName: "Charles",
                lastName: "Wise",
                students: {
                    create: {
                        firstName: "Pauline",
                        lastName: "Jenkins",
                        school: {
                            connect: {
                                id: -1 // How to reference a school that is being created?
                            }
                        }
                    }
                }
            }
        }
    }
});

不幸的是,我不知道在创建学生时如何传递学校的 ID。

我知道我可以通过两个电话来做到这一点,首先用老师创建一个学校,然后用刚刚创建的学校和老师创建一个学生:

const school = await prisma.school.create({
    data: {
        name: "Best",
        teachers: {
            create: {
                id: 2,
                firstName: "Charles",
                lastName: "Wise",
            }
        }
    },
    include: {
        teachers: true,
    }
});
await prisma.student.create({
    data: {
        firstName: "Pauline",
        lastName: "Jenkins",
        school: {
            connect: {
                id: school.id
            }
        },
        teacher: {
            connect: {
                id: school.teachers[0].id
            }
        }
    }
});

但这看起来有点奇怪且容易出错。

有没有办法将其重写为单个调用?

标签: node.jstypescriptpostgresqlprisma

解决方案


如果记录存在,您可以尝试使用此代码段进行连接,或者在记录不存在时随时创建。

prisma.teachers.create({
        data: {
            id: 2,
            firstName: 'Charles',
            lastName: 'Wise',
            students: {
                create: {
                    firstName: 'Pauline',
                    lastName: 'Jenkins',
                },
            },
            school: {
                connectOrCreate: {
                    where: {
                        name: 'best',
                    },
                    create: {
                        name: 'best',
                    },
                },
            },
        },
    });

推荐阅读