Tom*_*enn 7 postgresql count associations node.js sequelize.js
我有两个模型,project
和user
与每个其他在几个方面有关。
首先,project
是拥有一个user
具有下列关联关系:
Project.belongsTo(models.User, { as: 'Owner', foreignKey: 'userId' });
Run Code Online (Sandbox Code Playgroud)
其次, aproject
和user
通过user
喜欢a 的方式相关联project
。
Project.belongsToMany(models.User, { as: 'UserLikes', through: models.ProjectLikes, foreignKey: 'projectId' });
User.belongsToMany(models.Project, { as: 'LikedProjects', through: models.ProjectLikes, foreignKey: 'userId' });
Run Code Online (Sandbox Code Playgroud)
第三, aproject
和user
也可以通过Role成为 auser
的一部分来关联。project
Project.belongsToMany(models.User, { as: 'Users', through: models.ProjectRoles, foreignKey: 'projectId' });
User.belongsToMany(models.Project, { as: 'Roles', through: models.ProjectRoles, foreignKey: 'userId' });
Run Code Online (Sandbox Code Playgroud)
我想要实现的是找到所有项目并与它们一起返回相关的“喜欢”计数。但是,我真的很难弄清楚如何做到这一点。
我读过我应该能够做这样的事情:
models.Project.findAll({
limit: 5,
attributes: ['Project.*', [models.sequelize.fn('COUNT', models.sequelize.col('UserLikes.id')), 'totalLikes']],
include: [ { model: models.User, as: 'UserLikes' }],
group: [ models.Project.rawAttributes.id, models.sequelize.col('UserLikes.id') ]
})
.then(function (projects) {
return res.json(projects);
});
Run Code Online (Sandbox Code Playgroud)
但我得到一个 missing FROM-clause entry for table "UserLikes
错误。
我尝试将双方的关联更改为hasMany
使用特定的连接表模型,然后执行以下操作:
models.Project.findAll({
limit: 5,
attributes: ['Project.*', 'ProjectLikes.id', [models.sequelize.fn('COUNT', models.sequelize.col('ProjectLikes.id')), 'totalLikes']],
include: [ { model: models.ProjectLikes }],
group: [ models.Project.rawAttributes.id ]
})
.then(function (projects) {
return res.json(projects);
});
Run Code Online (Sandbox Code Playgroud)
但是我得到了同样的错误,或者关于 Id 不明确的错误或关于 Project.id 需要在 GROUP BY 子句中的错误(即使它是?!)。
我正在努力找出一些应该非常直接的东西......我几乎在考虑切换回 MongoDB!
请帮助...谢谢!
我对belongsToMany也有同样的问题,但我设法为hasMany解决了这个问题。您必须放入attributes: []
(models.ProjectLikes
在包含内)并且为了修复limit
错误,您必须放入选项subQuery: false
中findAll
。