代码之家  ›  专栏  ›  技术社区  ›  Matthieu Raynaud de Fitte

Prisma:如何在查询返回中添加列?

  •  1
  • Matthieu Raynaud de Fitte  · 技术社区  · 4 年前

    假设我有一张桌子 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位用户。

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

    我尝试获取的示例(使用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)
    }
    

    正如您所见,我的表中没有“count”列,必须在查询过程中插入它

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

    0 回复  |  直到 4 年前
        1
  •  2
  •   Tasin Ishmam    4 年前

    你可以用 orderBy 分类 user count 属于 posts 他们有。此外,您可以使用 take 操作员限制记录数量(类似于 LIMIT 命令)。最后,包括 计数 对于帖子,你可以在里面添加 include .

    这是你要找的问题

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

    据我从你的问题中了解,你只想退回 计数 而不是帖子记录本身。但是,如果还想返回post记录,也可以将其添加到 包括 声明,就像你现在做的那样。

    进一步阅读所用操作员的文档: