Sequelize - 如何获得 post 的评论,每条评论的点赞数

Sequelize - How to get reviews for post with likes count for each review

我有这样的功能。 它在 post 上收到评论。 而且它不起作用 - 它会发出无休止的请求。

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"]]
            },
            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;
    }

如果我们删除此行,函数 return 会计算一条评论的点赞次数。

await db.Review.includeNested(reviews, settings);

如果你删除这个块:

            attributes: {
                include: [[db.Sequelize.fn("COUNT", db.Sequelize.col("likes.id")), "likesCount"]]
            },

... 然后该函数将 return 一组注释。 为什么点赞数只回一个评论?

如何获得一组包含点赞数的评论? 这是嵌套函数:

this.includeNested = async function f(reviews, settings) {
                const idArr = reviews.map(el => el.id);
                const children = await models.Review.findAll({
                    where: {
                        parentId: idArr
                    },
                    ...settings
                });
    
                reviews.forEach(review => {
                    review.children = children.filter(ch => ch.parentId === review.id);
                });
                
                if (children.length)
                    await this.includeNested(children, settings);
            }

完整代码时无尽的查询字符串:

Executing (default): SELECT `review`.`id`, `review`.`level`, `review`.`isDeleted`, `review`.`parentId`, `review`.`text`, `review`.`type`, `review`.`createdAt`, `review`.`updatedAt`, `review`.`userId`, COUNT(`likes`.`id`) AS `likesCo
unt`, `user`.`nickname` AS `user.nickname`, `user`.`img` AS `user.img`, `user`.`role` AS `user.role` FROM `reviews` AS `review` LEFT OUTER JOIN `users` AS `user` ON `review`.`userId` = `user`.`id` LEFT OUTER JOIN `likes` AS `likes`
ON `review`.`id` = `likes`.`reviewId` WHERE `review`.`parentId` IN (NULL);

没有嵌套:

Executing (default): SELECT `review`.`id`, `review`.`level`, `review`.`isDeleted`, `review`.`parentId`, `review`.`text`, `review`.`type`, `review`.`createdAt`, `review`.`updatedAt`, `review`.`userId`, COUNT(`likes`.`id`) AS `likesCo
unt`, `user`.`nickname` AS `user.nickname`, `user`.`img` AS `user.img`, `user`.`role` AS `user.role` FROM `reviews` AS `review` LEFT OUTER JOIN `users` AS `user` ON `review`.`userId` = `user`.`id` LEFT OUTER JOIN `likes` AS `likes`
ON `review`.`id` = `likes`.`reviewId` WHERE `review`.`parentId` = '099d8a11-0fbe-420b-9a18-514989388c83' AND `review`.`type` = 'review' AND `review`.`isDeleted` = false;

没有include: [[db.Sequelize.fn("COUNT"...:

Executing (default): SELECT `review`.`id`, `review`.`level`, `review`.`isDeleted`, `review`.`parentId`, `review`.`text`, `review`.`type`, `review`.`createdAt`, `review`.`updatedAt`, `review`.`userId`, `user`.`nickname` AS `user.nick
name`, `user`.`img` AS `user.img`, `user`.`role` AS `user.role`, `likes`.`id` AS `likes.id`, `likes`.`userId` AS `likes.userId`, `likes`.`reviewId` AS `likes.reviewId` FROM `reviews` AS `review` LEFT OUTER JOIN `users` AS `user` ON
`review`.`userId` = `user`.`id` LEFT OUTER JOIN `likes` AS `likes` ON `review`.`id` = `likes`.`reviewId` WHERE `review`.`parentId` = '099d8a11-0fbe-420b-9a18-514989388c83' AND `review`.`type` = 'review' AND `review`.`isDeleted` = fa
lse;

尝试在评论中添加分组依据

const reviews = await db.Review.findAll({
    where: {
        parentId: entityId,
        type: 'review',
        isDeleted: false
    },
    // add group by id
    group: ["id"],
    ...settings
});