Prisma – Создание двух взаимозависимых моделей

Вопрос или проблема

Я создаю систему опросов с помощью Prisma и хочу, чтобы у моих опросов были разные версии. В идеале, у опроса всегда должна быть хотя бы одна версия, а версия всегда должна быть связана с опросом.

model Survey {
  ...
  activeVersionId   String           @unique
  activeVersion     SurveyVersion   @relation("activeVersion", fields: [activeVersionId], references: [id])
  versions          SurveyVersion[]
  ...
}

model SurveyVersion {
  ...
  surveyId        String
  survey          Survey  @relation(fields: [surveyId], references: [id])
  activeFor       Survey? @relation("activeVersion")
  ...
}

Возможно ли это вообще? У меня возникают проблемы при попытке создать новый опрос, так как он зависит от версии опроса, которая зависит от опроса.

Ответ или решение

Да, создание моделей, которые зависят друг от друга, возможно в Prisma, однако, важно правильно организовать взаимосвязи и учесть процесс создания записей в базе данных. В вашем случае, когда у вас есть модель Survey, которая должна иметь как минимум одну SurveyVersion, вы должны учесть, что в момент создания опроса необходимо создать и его первую версию.

Вот как можно это сделать:

  1. Определение моделей:

Ваши модели Survey и SurveyVersion имеют правильную структуру, однако уточнить некоторые моменты может быть полезным.

model Survey {
  id                String           @id @default(cuid())
  title             String
  activeVersionId   String
  activeVersion     SurveyVersion     @relation("activeVersion", fields: [activeVersionId], references: [id])
  versions          SurveyVersion[]    @relation("SurveyVersions")
}

model SurveyVersion {
  id         String            @id @default(cuid())
  title      String
  surveyId   String
  survey     Survey            @relation("SurveyVersions", fields: [surveyId], references: [id])
  isActive   Boolean           @default(false)
}

Обратите внимание, что я добавил @relation("SurveyVersions") к массиву versions в модели Survey, что позволяет Prisma корректно управлять зависимостями.

  1. Создание данных:

Когда вы создаёте новый опрос, вам нужно сразу создать и его первую версию. Например:

async function createSurveyWithVersion(prisma, surveyData, versionData) {
  const createdSurvey = await prisma.survey.create({
    data: {
      title: surveyData.title,
      activeVersion: {
        create: {
          title: versionData.title,
          isActive: true
        }
      }
    },
    include: {
      activeVersion: true
    }
  });

  return createdSurvey;
}

В этом коде:

  • Мы создаем новый опрос и одновременно создаем его первую версию через связь activeVersion.
  • isActive ставим в true для первой версии, чтобы она была активной.
  1. Обратите внимание на валидацию:

Перед созданием важно удостовериться, что данное действие соответствует бизнес-логике вашего приложения, т.е. каждый опрос должен всегда иметь хотя бы одну версию.

  1. Работа с существующими записями:

Когда вам нужно будет обновить активную версию, вы сможете просто изменять поле activeVersionId в модели Survey и обновлять свойство isActive у версий.

Например, чтобы обновить активную версию:

async function updateActiveVersion(prisma, surveyId, versionId) {
  await prisma.survey.update({
    where: { id: surveyId },
    data: { activeVersionId: versionId }
  });

  // Здесь можно дополнительно обновить другие версии, если это необходимо.
}

Таким образом, благодаря правильной организации моделей и последовательности операций, вы сможете избежать проблем с зависимостями, создавая и обновляя опросы и их версии в вашей системе.

Оцените материал
Добавить комментарий

Капча загружается...