Orm sequelize:如何为关联执行相当于FindCountAll的操作

Orm sequelize:如何为关联执行相当于FindCountAll的操作,orm,sequelize.js,Orm,Sequelize.js,我在sequelize中最大的痛苦之一就是基本上对关联进行“分页和计数” 对于一次性型号,使用findAndCountAll是相当简单的,对于很多型号来说有点痛苦,但对于多对多型号来说,这是完全不可能的 例如,我建立了多对多关联,其中用户可以属于多个组: const UserGroup = db.define('user_groups', { }) User.belongsToMany(Group, {through: UserGroup}) Group.belongsToMany(User,

我在sequelize中最大的痛苦之一就是基本上对关联进行“分页和计数”

对于一次性型号,使用
findAndCountAll
是相当简单的,对于很多型号来说有点痛苦,但对于多对多型号来说,这是完全不可能的

例如,我建立了多对多关联,其中用户可以属于多个组:

const UserGroup = db.define('user_groups', {
})
User.belongsToMany(Group, {through: UserGroup})
Group.belongsToMany(User, {through: UserGroup})
从一个组中获取所有用户非常简单:

user.getGroups().then....
但将其移植到
findAndCountAll
似乎并没有同样的效果:

User.findAndCountAll({
        include: [{model: Group, 
                             through: UserGroup,
                             where: { groupId : group.id,
                                      userId : {$ne: user.id}}
        }],
        limit: limit,
        offset: offset, ...
这不起作用,因为它将where子句中的键关联到
模型

我还尝试:

User.findAndCountAll({
        include: [{model: Group,
                             include: { 
                                model: UserGroup,
                                where: { groupId : group.id,
                                               userId : {$ne: user.id}}}
        }],
        limit: limit,
        offset: offset, ...
但是它也失败了,错误是:用户组与组没有关联,这不是真的


有没有一种干净的方法可以做到这一点,最好是使用helper方法?

我担心,在急于加载关联时(或者至少在您还想向关联添加一些条件时),不可能使用
findAndCountAll
方法。在您的情况下,没有选项可以使用
user.getGroups()
获取有关关联项目总数的信息


虽然您可以使用Sequelize的速记方法计算关联的实例,但在您的示例中,在返回
user.getGroups()
之前,
user.countGroups()
。如果要获取具有某些条件的相关组,只需将它们作为
getGroups()
method参数传递(它采用与标准
findAll
相同的options参数)

在急于加载关联时,恐怕不可能使用
findAndCountAll
方法(或者至少当您还想向关联添加一些条件时)。在您的情况下,无法使用
user.getGroups()
获取有关关联项目总数的信息


虽然您可以使用Sequelize的速记方法计算关联的实例,但在您的情况下,在返回
user.getGroups()
之前,
user.countGroups()
。如果要获取具有某些条件的相关组,只需将它们作为
getGroups()
方法参数传递即可(它采用与标准
findAll
相同的选项参数)

我之前遇到过这个问题,我决定以这种方式更改功能

const include = [
  {
    model: models.UserGroup,
    attributes: [],
    as: 'groups'
  }
];

const [total, data] = await Promise.all([
    User.count({ distinct: true, include }),
    User.findAll({
       order: [sequelize.literal(`MAX("groups"."createdAt") desc`)],
       group: ['User.id'],
       include
    })
]);

我之前遇到过这个问题,我决定以这种方式更改功能

const include = [
  {
    model: models.UserGroup,
    attributes: [],
    as: 'groups'
  }
];

const [total, data] = await Promise.all([
    User.count({ distinct: true, include }),
    User.findAll({
       order: [sequelize.literal(`MAX("groups"."createdAt") desc`)],
       group: ['User.id'],
       include
    })
]);