Разбор модели Role в Prisma

Модель Role в Prisma описывает сущность «Роль» в базе данных. Давайте разберём её структуру и особенности.


Описание модели

prisma

model Role {
  id     Int    @id @default(autoincrement())
  title  String @unique // наименование роли
  User   User?  @relation(fields: [userId], references: [id])
  userId Int?
}


1. Поля модели

id

  • Тип: Int (целое число).
  • Атрибуты:
    • @id: Указывает, что это первичный ключ (Primary Key) таблицы.
    • @default(autoincrement()): Значение этого поля будет автоматически увеличиваться при добавлении новой записи (аналог AUTO_INCREMENT в SQL).
  • Назначение: Уникальный идентификатор для каждой роли.

title

  • Тип: String (строка).
  • Атрибуты:
    • @unique: Указывает, что значение этого поля должно быть уникальным в таблице.
  • Назначение: Название роли (например, «Администратор», «Пользователь»).

User

  • Тип: User? (опциональная связь с моделью User).
  • Атрибуты:
    • @relation(fields: [userId], references: [id]): Указывает, что это поле связано с моделью User через внешний ключ userId, который ссылается на поле id в модели User.
  • Назначение: Связь между ролью и пользователем. Это поле позволяет определить, какой пользователь связан с данной ролью.

userId

  • Тип: Int? (опциональное целое число).
  • Назначение: Внешний ключ, который хранит идентификатор пользователя (id из модели User), связанного с этой ролью.

2. Связь с моделью User

Модель Role имеет связь с моделью User. Это реализовано через поле User и внешний ключ userId.

Тип связи

  • Один-к-одному (1:1): Каждая роль может быть связана с одним пользователем, но связь является опциональной (пользователь может не быть связан с ролью).

Пример модели User

Для работы этой связи в модели User должно быть определено поле, которое ссылается на модель Role. Например:

prisma

model User {
  id    Int    @id @default(autoincrement())
  name  String
  email String @unique
  role  Role?  @relation(fields: [roleId], references: [id])
  roleId Int?
}


3. Особенности модели

  1. Уникальность title:
    • Поле title уникально, что гарантирует, что в базе данных не будет двух ролей с одинаковым названием.
  2. Опциональная связь:
    • Поля User и userId являются опциональными (?), что означает, что роль может существовать без привязки к пользователю.
  3. Автоинкремент для id:
    • Поле id автоматически увеличивается при добавлении новой записи, что упрощает управление идентификаторами.

Пример использования

Создание роли

javascript

const newRole = await prisma.role.create({
  data: {
    title: "Администратор",
  },
});

Создание пользователя с ролью

javascript

const newUser = await prisma.user.create({
  data: {
    name: "Иван Иванов",
    email: "ivan@example.com",
    role: {
      create: {
        title: "Пользователь",
      },
    },
  },
});

Получение роли с пользователем

javascript

const roleWithUser = await prisma.role.findUnique({
  where: { id: 1 },
  include: { User: true },
});
console.log(roleWithUser);


Заключение

Модель Role в Prisma описывает сущность «Роль» с уникальным названием и опциональной связью с пользователем. Она полезна для управления ролями в приложении, например, для разграничения прав доступа (администратор, пользователь и т.д.).