Вопрос или проблема
У меня есть эти модели, и я пытаюсь создать новую запись в таблице 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
), которые вы пытаетесь подключить, не были найдены в базе данных. Это может произойти по нескольким причинам:
-
Некорректные идентификаторы пользователей. Проверьте, что в
body.judges
действительно содержатся идентификаторы пользователей, которые уже существуют в таблицеUser
. -
Отсутствие пользователей в базе данных. Убедитесь, что записи пользователей с переданными идентификаторами присутствуют в вашей базе данных.
-
Структура данных. Если
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 для выявления дополнительных ошибок.