获取 Sequelize BelongsToMany 协会的计数

Tom*_*enn 7 postgresql count associations node.js sequelize.js

我有两个模型,projectuser与每个其他在几个方面有关。

首先,project拥有一个user具有下列关联关系:

Project.belongsTo(models.User, { as: 'Owner', foreignKey: 'userId' });
Run Code Online (Sandbox Code Playgroud)

其次, aprojectuser通过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)

第三, aprojectuser也可以通过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!

请帮助...谢谢!