【问题标题】:Prisma : how can I add a column on a query return?Prisma:如何在查询返回中添加一列?
【发布时间】:2021-12-22 07:44:29
【问题描述】:

假设我有一个表User 有一个名称和一个ID,还有一个表Post 有一个名称和内容。这两个表通过多对多关系链接(一个帖子可以有很多用户/作者,每个用户可以有很多帖子)

例子:

model User {
  id            Int      @id @default(autoincrement())
  name          String
  posts         users_to_posts[]
}

model Post {
  id            Int      @id @default(autoincrement())
  name          String
  users         users_to_posts[]
}

model user_to_post {
  user          user? @relation(fields: [user_id], references: [id])
  user_id       Int
  post          signe? @relation(fields: [post_id], references: [id])
  post_id       Int
  @@id([user_id, post_id])
}

我想要做的是查询用户表并获得发表最多帖子的前 10 位用户。

但是,我不希望只返回用户 + 帖子计数的组合,而是在返回的 JSON 中完整返回用户、他的 ID 和他写的帖子数量作为单独的键

我试图获得的示例(使用 nextJS):

import { PrismaClient, Prisma } from '@prisma/client'

const prisma = new PrismaClient()


export default async function handler(req, res) {
    const ret = await prisma.user.findMany({
        include: {
            posts: {
                select: {
                    post: true
                }
            }
        }
        // include post count
        // order by post count
        // limit 10
    });
    res.status(200).json(ret)
}

如您所见,我的表中没有“计数”列,它必须在查询期间插入

我现在最好的选择是解析获得的 json(ret 变量)并通过 typescript 完成所有操作,但这远非理想

【问题讨论】:

    标签: typescript next.js prisma


    【解决方案1】:

    您可以使用orderBycountpostsuser 记录进行排序。此外,您可以使用take 运算符来限制记录数(类似于SQL 中的LIMIT 命令)。最后,要包含 count 的帖子,您可以将其添加到 include 中。

    这是您要查找的查询

    await prisma.user.findMany({
        orderBy: {
            posts: {
                _count: "desc",
            },
        },
        take: 10,
        include: {
            _count: {
                select: {
                    posts: true,
                },
            },
        },
    });
    
    

    据我了解,您只想返回帖子的count,而不是帖子记录本身。但是,如果您还想返回帖子记录,您也可以将其添加到 include 语句中,就像您目前正在做的那样。

    从文档中进一步阅读所使用的运算符:

    【讨论】:

      猜你喜欢
      • 2021-01-23
      • 2014-02-15
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多