如何在GraphQL中实现无限嵌套评论的递归查询?
如何在GraphQL中递归获取无限嵌套评论?
我需要实现无限嵌套评论系统,但当前GraphQL查询必须反复编写children字段才能获取深层子评论,有没有递归实现的方法?
我的查询代码:
query GetComments($postId: Int!, $skip: Int!, $take: Int!) { getComments(postId: $postId, skip: $skip, take: $take) { id createdAt updatedAt authorId comment parentId postId author { name id image admin moder } children { id createdAt updatedAt authorId comment parentId postId author { name id image admin moder } } } }
类型定义:
type User { id: Int name: String image: String admin: Boolean moder: Boolean } type Comment { id: String createdAt: String updatedAt: String authorId: Int comment: String postId: Int author: User parentId: String children: [Comment] }
解决方案:使用GraphQL片段实现递归查询
GraphQL支持通过**片段(Fragment)**实现递归查询,片段可以引用自身,从而自动获取多层嵌套的子评论,无需手动重复编写children字段。
1. 定义递归片段
创建一个包含评论所有必要字段的片段,并在children字段中引用该片段本身:
fragment CommentFragment on Comment { id createdAt updatedAt authorId comment parentId postId author { name id image admin moder } children { ...CommentFragment } }
2. 在查询中使用片段
修改原查询,用定义好的片段替换重复的字段声明:
query GetComments($postId: Int!, $skip: Int!, $take: Int!) { getComments(postId: $postId, skip: $skip, take: $take) { ...CommentFragment } }
这样执行查询时,GraphQL会自动递归遍历所有层级的children,返回完整的嵌套评论结构。
额外优化:控制递归深度(可选)
如果担心无限递归导致性能问题,可以添加一个深度参数来限制查询层级:
query GetComments($postId: Int!, $skip: Int!, $take: Int!, $depth: Int!) { getComments(postId: $postId, skip: $skip, take: $take) { ...CommentFragment } } fragment CommentFragment on Comment { id createdAt updatedAt authorId comment parentId postId author { name id image admin moder } children @include(if: $depth > 0) { ...CommentFragment } }
后端Resolver需要配合这个参数,每次递归时将depth减1,直到为0时停止获取子评论。
内容的提问来源于stack exchange,提问作者Netty
相关产品推荐
相关产品推荐

