如何连接多个m-n关系记录

时间:2021-04-24 09:40:15

标签: node.js typescript postgresql prisma

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

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
            }
        }
    }
});

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

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

1 个答案:

答案 0 :(得分:0)

您可以尝试使用此代码片段在记录存在时连接或在记录不存在时随时创建。

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