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
});
我有这样的功能。 它在 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
});