javascript - Prisma 3 关系聚合(求和)

标签 javascript postgresql prisma

我在尝试获取相关数据的总和时遇到了一些问题。

这是我的模式:

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
}

我想得到的是:

  • 1 按 ID 列出
  • 包含的列表项
  • 以及每个项目的值总和(来自 Vote 表)。

这是我想出的:

prisma.list.findUnique({
    where: { id },
    include: {
        items: {
            include: {
                votes: {
                    include: {
                        _sum: {
                            select: {
                                value: true,
                            },
                        },
                    },
                },
            },
        },
    },
})

我根据在网上找到的多个不同查询构建了查询(其中大部分在 Prisam Docs 中)。

我还注意到 Prisma Docs 缺少很多东西,比如(添加/删除相关数据 - 多对多关系)。是否有更好的文档或包含此类内容的示例项目?

谢谢!

最佳答案

目前无法将其作为单个查询。您可以做的是在取回这些值后对其求和。

我基于 StackOverflow 创建了一个类似的示例。给定以下 Prisma Schema:

// 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
}

可以编写如下脚本:

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))

然后在取回数据后对值求和。

如果这不适合您,我鼓励您写一个 feature request对于 Prisma 团队。

关于javascript - Prisma 3 关系聚合(求和),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69788104/

相关文章:

postgresql - Postgres 可编辑联合 View

sql - 每当我在 postgreSQL 中为数据库播种时,如何将自动递增的 id 列重置为 1?

graphql - 我真的需要用于graphql的prisma ORM吗?

postgresql - Prisma模型自引用(一对多)

javascript - TypeError : selector. 拆分不是 Cypress 的函数

javascript - 我可以在用户单击链接后操作 DOM 吗?

java - 有没有办法从 Hibernate 使用 Postgresql 副本(在表中加载 CSV)?

node.js - 如何使用 knex 和 postgres 插入 ARRAY 数据类型

javascript - 按 Enter 键时调用 onKeyup 事件函数不起作用

javascript - 使用类名访问 href 属性