Nodejs Prisma включает в себя не уважает удостоверение личности бабушки и дедушки

#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.

 

Этот обходной путь должен работать достаточно хорошо при условии, что количество продуктов/ответов не невероятно велико.