我正在Prisma的帮助下创建一个数据库,我遇到了一个问题.我有两个模型:用户和课程.在第一课中,存储了参与的用户的ID和培训者的ID,这也是一个用户模型.我希望,在下载课程时,能够立即获得参与其中的用户和培训师,而不是他们的ID,而是整个用户的数据.

我知道我需要一段感情,但我不能创造. 我的图式.棱镜:

datasource db {
    provider = "postgresql"
    url      = env("DATABASE_URL")
}

generator client {
    provider = "prisma-client-js"
}

enum LessonState {
    ACTIVE
    CLOSED
}

model Lesson {
    id          String      @id @default(uuid()) @map("_id") @db.Uuid
    date        DateTime    @default(now())
    subject     String
    description String
    state       LessonState @default(ACTIVE)
    usersIds    String[]    @db.Uuid
    coachId     String      @unique @db.Uuid
}

enum UserRoles {
    ADMIN
    USER
}

model User {
    id        String    @id @default(uuid()) @map("_id") @db.Uuid
    name      String
    surname   String
    password  String
    login     String    @unique
    birthDate DateTime
    role      UserRoles @default(USER)
    createdAt DateTime  @default(now())
}

我关心单向关系,但从我发现的情况来看,Prisma不允许这样的关系,所以如果有必要,他们可以是双向的.至于 Select PostgreSQL,你可以说这是随机的--如果其他系统允许我做我需要的事情,我可以切换到它.同样的道理也适用于Prisma--如果它支持我需要的东西,我可以使用另一个ORM.

推荐答案

您需要添加关系来解决此问题,如下所示 教练关系为一对多,课程用户关系为多对多

// schema.prisma
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgres"
  url      = env("DATABASE_URL")
}

enum LessonState {
    ACTIVE
    CLOSED
}

model Lesson {
    id          String      @id @default(uuid()) @map("_id") @db.Uuid
    date        DateTime    @default(now())
    subject     String
    description String
    state       LessonState @default(ACTIVE)
    users       User[]   @relation(name: "lesson_users")
    coachId     String   @db.Uuid
    coach User  @relation(name: "coach", fields: [coachId], references: [id])
}

enum UserRoles {
    ADMIN
    USER
}

model User {
    id        String    @id @default(uuid()) @map("_id") @db.Uuid
    name      String
    surname   String
    password  String
    login     String    @unique
    birthDate DateTime
    role      UserRoles @default(USER)
    createdAt DateTime  @default(now())
    myLessons   Lesson[] @relation(name: "lesson_users")
    lessonsITeach    Lesson[] @relation(name: "coach")
}

以下查询返回所有课程,其中包含参与该课程的用户和培训者的列表

await prisma.lesson.findMany({
  include: {
    users: true,
    coach: true,
  },
});

获取该课程参与的用户的ID

await prisma.lesson.findFirst({
      include: {
        users: { select: { id: true } },
        coach: true,
      },
    });

enter image description here

获取用户参与的所有课程以及用户教授的课程

await prisma.user.findFirst({
  include: {
    myLessons: true,
    lessonsITeach: true,
  },
});

仅获取ID的步骤

await prisma.user.findFirst({
  include: {
    myLessons: { select: { id: true } },
    lessonsITeach: { select: { id: true } },
  },
});

enter image description here

Database相关问答推荐

将数据拆分为月份(以Postgres为单位

如何正确创建mongo模型和客户端?

在 PostgreSQL 的数组列中查找字符串

如何手动卸载 Oracle?

使用 ContentValues 和更新方法更新 sql 数据库

操作错误:FATAL: database "django" does not exist

当使用多个 WHEN MATCHED 语句时,它们是全部执行,还是只执行一个?

SQLite 中内存数据库的优势

设计数据库时最重要的考虑因素是什么?

South migration error: NoMigrations exception for django.contrib.auth

如何在 MySQL 中强制执行唯一约束?

使用 PDO 获取单行单列

面向文档的数据库是否旨在取代关系数据库?

Oracle 的免费桌面客户端?

如何将 Android 手机上的 SQLite 数据库与服务器上的 MySQL 数据库同步?

数据完整性和数据一致性之间有什么区别吗?

你如何记录你的数据库 struct ?

复式记账的关系数据模型

Select 多模型 DBMS 时要考虑哪些因素? (OrientDB 与 ArangoDB)

数据库索引及其 Big-O 表示法