You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Prisma存储Reddit式嵌套评论 如何一次性查询所有层级子评论

可以实现,推荐两种实现方案

方案1:递归CTE原生查询(单条查询,无限层级通用,性能最优)

Prisma Client本身暂未原生支持无限层级的嵌套关联查询,你可以借助数据库的递归公用表表达式(CTE)能力,仅用1次数据库查询就能拿到指定父评论的所有后代,再手动组装为嵌套结构即可。

示例代码(以PostgreSQL/MySQL 8.0+为例):

async function getNestedCommentTree(rootCommentId: string) {
  // 单条递归CTE查询拿到根评论+所有后代评论的扁平数据
  const allComments = await prisma.$queryRaw`
    WITH RECURSIVE comment_tree AS (
      -- 锚点成员:查询目标根评论
      SELECT id, comment, parentId
      FROM Comment
      WHERE id = ${rootCommentId}

      UNION ALL

      -- 递归成员:迭代查询所有子后代评论
      SELECT c.id, c.comment, c.parentId
      FROM Comment c
      INNER JOIN comment_tree ct ON c.parentId = ct.id
    )
    SELECT * FROM comment_tree;
  ` as Array<{id: string, comment: string, parentId: string | null}>;

  // 把扁平数组组装为嵌套结构
  const commentMap = new Map<string, any>();
  // 先初始化所有评论节点,预加children空数组
  allComments.forEach(cmt => {
    commentMap.set(cmt.id, { ...cmt, children: [] });
  });

  let rootNode = null;
  allComments.forEach(cmt => {
    const currentNode = commentMap.get(cmt.id);
    if (cmt.parentId === null || !commentMap.has(cmt.parentId)) {
      rootNode = currentNode;
      return;
    }
    // 把当前节点挂载到父节点的children数组
    commentMap.get(cmt.parentId).children.push(currentNode);
  });

  return rootNode;
}

调用这个方法返回的结构和你要求的JSON格式完全一致。

方案2:嵌套include查询(仅适用于层级固定的场景)

如果你的业务对评论嵌套层级有明确上限,不需要支持真·无限嵌套,也可以直接写固定层级的Prisma嵌套查询,比如最多3层嵌套的写法:

const commentTree = await prisma.comment.findUnique({
  where: { id: rootCommentId },
  include: {
    children: {
      include: {
        children: {
          include: {
            children: true
          }
        }
      }
    }
  }
});

这个方案的缺点是层级不固定时无法使用,层级越深语法越冗余,查询性能也比递归CTE差。

注意事项
  • 递归CTE仅支持MySQL 8.0+、PostgreSQL、SQL Server等较新版本的主流数据库,MySQL 5.x版本不支持该语法
  • 如果单条根评论的后代评论量极大(超过千级),建议在CTE里增加深度限制,避免查询超时

内容的提问来源于stack exchange,提问作者lumenwrites

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:24:03