Tengo algunos problemas para obtener la suma de los datos relacionados.
Este es mi esquema:
model Vote { userId Int user User @relation(fields: [userId], references: [id]) itemId Int item Item @relation(fields: [itemId], references: [id]) value Int @@id([userId, itemId]) } model Item { id Int @id @default(autoincrement()) userId Int user User @relation(fields: [userId], references: [id]) listId Int list List @relation(fields: [listId], references: [id]) votes Vote[] body String @db.VarChar(255) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model List { id Int @id @default(autoincrement()) userId Int user User @relation(name: "Ownership", fields: [userId], references: [id]) items Item[] sharedWith User[] @relation(name: "Shared") title String @db.VarChar(255) description String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model User { id Int @id @default(autoincrement()) email String @unique password String name String? lists List[] @relation(name: "Ownership") items Item[] votes Vote[] sharedWith List[] @relation(name: "Shared") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt }Lo que estoy tratando de conseguir es:
Esto es lo que se me ocurrió:
prisma.list.findUnique({ where: { id }, include: { items: { include: { votes: { include: { _sum: { select: { value: true, }, }, }, }, }, }, }, })Construí consultas basadas en múltiples consultas diferentes que encontré en línea (la mayoría de ellas en Prisam Docs).
También noté que a Prisma Docs le faltan muchas cosas, como (agregar/eliminar datos relacionados, relación de muchos a muchos). ¿Hay mejores documentos o proyectos de ejemplo con cosas como estas?
¡Gracias!
Esto no es posible actualmente como una sola consulta. Lo que puede hacer es sumar los valores después de recuperarlos.
Creé un ejemplo similar basado en StackOverflow. Dado el siguiente Esquema Prisma:
// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema datasource db { provider = "postgresql" url = env("DATABASE_URL") } generator client { provider = "prisma-client-js" } model User { id Int @id @default(autoincrement()) name String votes Vote[] questions Question[] } model Question { id Int @id @default(autoincrement()) question String votes Vote[] user User @relation(fields: [userId], references: [id]) userId Int } model Vote { id Int @id @default(autoincrement()) value Int @default(1) questionId Int question Question @relation(fields: [questionId], references: [id]) user User @relation(fields: [userId], references: [id]) userId Int }Puedes escribir el siguiente script:
import { PrismaClient } from "@prisma/client" const prisma = new PrismaClient() async function main() { const users = await prisma.user.findMany({ include: { questions: { include: { votes: { select: { value: true, }, }, }, }, }, }) for (let user of users) { for (let question of user.questions) { let vote_sum = 0 for (let vote of question.votes) { vote_sum += vote.value } ;(question as any).vote_sum = vote_sum } } console.dir(users, { depth: Infinity }) } main().catch((err) => console.error(err))Luego sume los valores después de recuperar los datos.
Si esto no funciona bien para usted, lo animo a que escriba una solicitud de función para el equipo de Prisma.