#node.js #typescript #prisma
Вопрос:
Я использую prisma orm в nodejs и имею следующую схему (пример)
model User
{
id Int @id @default(autoincrement())
answers Answer[]
}
model Product
{
id Int @id @default(autoincrement())
questions Question[]
}
model Question
{
id Int @id @default(autoincrement())
products Product[]
answers Answer[]
}
model Answer
{
id Int @id @default(autoincrement())
userId Int
user User @relation(fields: [userId], references: [id])
productId Int
product Product @relation(fields: [productId], references: [id])
questionId Int
question Question @relation(fields: [questionId], references: [id])
}
Можно ли получить список продуктов с вопросами и последними ответами на каждый вопрос?
Проблема, с которой я сталкиваюсь, заключается в том, что вложенные элементы не уважают идентификатор бабушки и дедушки.
Например, в этом коде:
let products = await prisma.product.findMany({
include: {
questions: {
include: {
answers: true
}
}
}
})
возвращенные ответы на каждый вопрос также не относятся к продукту, к которому я хочу, чтобы они принадлежали.
Чего мне не хватает?
Комментарии:
1. У меня есть два вопроса. Во-первых, если один
Question
может быть связан с несколькимиProduct
записями, то почему ответ для определенногоQuestion
связан только с однойProduct
. Разве это не должно быть связано со всем тем, сProducts
чемQuestion
связано само по себе? Я ничего не знаю о вашей бизнес-логике/домене и могу ошибаться, поэтому разъяснение поможет. Во — вторых,Answer[]
связь отсутствует в моделиUser
иProduct
вашей схемы,a. Это случайно?2. Пока это просто оценка, но вот примерные данные. Например, есть продукты «телефон» и «чехол для телефона», и на вопросы «как вы удовлетворены своим продуктом» и «как вы удовлетворены доставкой/упаковкой» Пользователь затем дает ответ на каждую пару вопрос-продукт, поэтому «Как вы удовлетворены своим продуктом» — для продукта «телефон» и как вы удовлетворены своим продуктом» — для продукта «чехол для телефона» и аналогично для второго вопроса. что касается отношения ответа [], его случайное «да», я отредактирую.
Ответ №1:
Насколько мне известно, невозможно выполнить запрос, который вы ищете (второй уровень вложенного включения, который также учитывает идентификатор дедушки и бабушки).
Возможное обходное решение состоит в том, чтобы включать ответы вместе с вопросами в product
запрос вместо того, чтобы вкладывать их внутрь questions
. Затем вы можете объединить вопросы и ответы на уровне приложения (либо в бэкэнде, либо во внешнем интерфейсе, в зависимости от того, что наиболее подходит).
Код будет выглядеть примерно так
let products = await prisma.product.findMany({
include: {
questions: true,
answers: true, // Assuming the relation field is called answers. You confirmed you accidentally forgot to mention the field in your schema.
},
});
// In Javascript/Typescript: For every product, iterate across every answer and add to the questions array.
Этот обходной путь должен работать достаточно хорошо при условии, что количество продуктов/ответов не невероятно велико.