Sequelize查询帖子评论并统计每条点赞数 解决单条返回及死循环问题
问题根因
1. 仅返回单条评论的原因
你使用的COUNT是SQL聚合函数,未显式配置GROUP BY分组规则时,数据库会把所有匹配的评论行合并为1行,返回全局点赞数统计结果,而非按每条评论单独统计,因此只会得到1条记录。
2. 无限请求的原因
未配置GROUP BY时,即使没有匹配的子评论,带COUNT的查询也会返回1行统计结果(除likesCount为0外,其余字段均为NULL),导致children.length永远为1,递归终止条件if (children.length)永远成立,后续查询的parentId为NULL,进入无限递归循环。
解决方案
在查询配置settings中添加GROUP BY规则,按评论主键和关联的用户主键分组,保证每条评论单独统计点赞数,修改后的配置如下:
async getReviews(entityId) { let settings = { include: [{ model: db.User, attributes: ['nickname', 'img', 'role'], }, { attributes: [], model: db.Like }], attributes: { include: [[db.Sequelize.fn("COUNT", db.Sequelize.col("likes.id")), "likesCount"]] }, // 新增分组规则,按评论ID、关联用户ID分组,确保每条评论独立统计点赞数 group: ['review.id', 'user.id'], raw: true, nest: true } const reviews = await db.Review.findAll({ where: { parentId: entityId, type: 'review', isDeleted: false }, ...settings }); await db.Review.includeNested(reviews, settings); return reviews; }
如果你的数据库开启了严格SQL模式,需将SELECT中所有非聚合字段都加入GROUP BY列表,即补充review表的所有查询字段。
修改后分组逻辑会让无匹配子评论的查询返回空数组,递归会正常终止,同时每条评论都会返回独立的点赞统计值。
内容的提问来源于stack exchange,提问作者ATLANT
相关产品推荐
相关产品推荐

