Orm sequelize:如何为关联执行相当于FindCountAll的操作
我在sequelize中最大的痛苦之一就是基本上对关联进行“分页和计数” 对于一次性型号,使用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,
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
})
]);