Не удается соединить модель prisma с необязательными отношениями.

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

У меня есть эти модели, и я пытаюсь создать новую запись в таблице Criteria, где “судьи” являются необязательными.

Это схема prisma, которую я использую:

model User {
  id            Int       @id @default(autoincrement())
  email         String    @unique
  name          String?
  lastname      String?
  image         String?
  password      String
  emailVerified DateTime?
  criteriaId    Int?
  criteria      Criteria? @relation(fields: [criteriaId], references: [id])
  score         Score[]
}

model Heat {
  id            Int            @id @default(autoincrement())
  scorecardId   Int
  scorecard     Scorecard      @relation(fields: [scorecardId], references: [id])
  title         String
  order         Int
  presentations Presentation[]
}

model Scorecard {
  id              Int        @id @default(autoincrement())
  title           String
  rankFrom        Int        @default(0)
  rankTo          Int        @default(100)
  includesPenalty Boolean    @default(true)
  heats           Heat[]
  criterias       Criteria[]
}

model Criteria {
  id               Int        @id @default(autoincrement())
  name             String
  ponderation      Int
  judges           User[]
  isVisible        Boolean    @default(true)
  isUndrawCriteria Boolean    @default(false)
  undrawPriority   Int?
  scorecardId      Int?
  scorecard        Scorecard? @relation(fields: [scorecardId], references: [id])
  score            Score[]
}

model Score {
  id             Int           @id @default(autoincrement())
  criteriaId     Int
  criteria       Criteria      @relation(fields: [criteriaId], references: [id])
  users          User[]
  presentationId Int
  presentation   Presentation? @relation(fields: [presentationId], references: [id], onDelete: Cascade)
  score          Int?
}

model Presentation {
  id      Int                @id @default(autoincrement())
  heatId  Int
  heat    Heat               @relation(fields: [heatId], references: [id], onDelete: Cascade)
  title   String
  image   String?
  status  PresentationStatus @default(PENDING)
  order   Int
  scoreId Int?
  scores  Score[]
}

enum UserRole {
  USER
  ADMIN
}


enum PresentationStatus {
  EVALUATED
  PENDING
  CLAIM
}

Я пытаюсь создать новую запись в маршруте api Nextjs.

const newrecord = await prisma.criteria.create({
            data: {
                name: body.name,
                ponderation: body.ponderation,
                isVisible: body.isVisible,
                isUndrawCriteria: body.isUndrawCriteria,
                undrawPriority: body.undrawPriority,
                scorecardId: body.scorecardId,
                judges: {
                    connect: body.judges
                }
            }
        });

Затем я получаю эту ошибку в консоли:
Ожидалось, что будет подключено 1 запись после операции подключения в отношении один-ко-многим 'CriteriaToUser', найдено 0.

Возможно, это глупая ошибка новичка, но я не вижу, где ошибка.

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

Судя по вашему описанию, проблема заключается в том, что вы пытаетесь создать новую запись в таблице Criteria, при этом указывая связь с моделью User, в которой судьи являются необязательными. Ошибка, с которой вы столкнулись, указывает на то, что Prisma не может подключить указанные записи пользователей к новой записи Criteria. Давайте проанализируем ваш код и схему более детально.

Анализ проблемы

Вы создали модель Criteria, которая содержит поле judges, связанное с моделью User. Как видно из схемы, это односторонняя связь "один-ко-многим" (one-to-many), где одна запись Criteria может быть связана с несколькими записями User. При этом вы используете метод connect, чтобы связать существующих пользователей с создаваемой записью Criteria.

Ошибка, которую вы увидели:

Expected 1 records to be connected after connect operation on one-to-many relation 'CriteriaToUser', found 0.

указывает на то, что предоставленные идентификаторы пользователей (body.judges), которые вы пытаетесь подключить, не были найдены в базе данных. Это может произойти по нескольким причинам:

  1. Некорректные идентификаторы пользователей. Проверьте, что в body.judges действительно содержатся идентификаторы пользователей, которые уже существуют в таблице User.

  2. Отсутствие пользователей в базе данных. Убедитесь, что записи пользователей с переданными идентификаторами присутствуют в вашей базе данных.

  3. Структура данных. Если body.judges содержит массив объектов, убедитесь, что они имеют правильный формат. Метод connect требует массив объектов, каждый из которых должен содержать уникальный идентификатор пользователя. Пример правильного формата:

    body.judges = [{ id: 1 }, { id: 2 }]; // Пример правильной структуры

Решение

Сначала убедитесь, что вы передаете правильные и уже существующие идентификаторы пользователей. Для этого вы можете перед запросом записи в Criteria выполнить запрос, который проверит существование пользователей:

const existingUsers = await prisma.user.findMany({
    where: {
        id: { in: body.judges.map(judge => judge.id) } // Получаем массив id судей
    }
});

// Проверьте, что у вас есть существующие пользователи
if (existingUsers.length !== body.judges.length) {
    throw new Error('Один или несколько судей не найдены в базе данных');
}

// Дальше создаем запись
const newrecord = await prisma.criteria.create({
    data: {
        name: body.name,
        ponderation: body.ponderation,
        isVisible: body.isVisible,
        isUndrawCriteria: body.isUndrawCriteria,
        undrawPriority: body.undrawPriority,
        scorecardId: body.scorecardId,
        judges: {
            connect: body.judges
        }
    }
});

Заключение

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

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

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

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