我正在构建一个应用程序,Express,Postgres作为数据库,Sequelize作为ORM。
我有两个型号,User和Post。帖子属于用户,用户可以有很多帖子。每个帖子都有一个类型,可以是1,2或3。
我想访问每个用户的姓名和他有多少帖子,按类型划分。
响应应该是这样的:
{
"name": "John",
"typeOne": 1,
"typeTwo": 3,
"typeThree": 5
}
我目前的代码如下:
router.route('/:id').get(async (req, res) => {
const user = await User.findOne({
where: { id: req.params.id },
include: {
model: Post,
where: { type: 1 }
}
});
const typeTwo = await User.findOne({
where: { id: req.params.id },
include: {
model: Post,
where: { type: 2 }
}
});
const typeThree = await User.findOne({
where: { id: req.params.id },
include: {
model: Post,
where: { type: 3 }
}
});
res.send({
name: user.first_name,
typeOne: user.posts.length,
typeTwo: typeTwo.posts.length,
typeThree: typeThree.posts.length });
})
我得到了正确的答案,但我认为这段代码可以写得更好。编译它需要花费很多时间。我怎样才能获得总数?
谢谢!
答案 0 :(得分:0)
您可以使用groupby
和count
User.findAll({
where: { id: req.params.id },
attributes: {
include: ['name', 'posts.type', [Sequelize.fn("COUNT", Sequelize.col("posts.type")), "postsCount"]]
},
include: [{
model: Post, attributes: []
}],
group: ['model.type'] // also try, group: ['Post.type']
});