关联(pivot,belongsToMany)中的Sequelize挂钩(afterCreate.afterUpdate)不起作用

时间:2017-03-22 16:32:45

标签: orm associations hook sequelize.js

我使用Sequelize作为ORM构建API。我想整合一些"听众"在核心逻辑中检查某些值是否已经改变并基于此触发某些逻辑。

我主要关注的一个问题是客户和用户之间的数据透视表。 (BelongsToMany)。该关系在枢轴中有一些额外的字段,如" is_admin"或" notify_user"。这描述了用户是某个客户的管理员,并且系统是否应该通知客户该客户的操作。

我的API支持数据透视表的修补'数据。现在我要做的是,如果is_admin值发生变化,请触发其他逻辑来更新foo。

所有挂钩都适用于基础对象模型(用户和客户)。但是我的钩子都没有在枢轴对象模型上被触发。

不确定Sequelize是否支持此功能。

提前致谢

我的关系设置如下:

private static setupCustomerRelations(sq: Sequelize.Sequelize) {

    const user = sq.models['User'] || new UserRepo().getNewInstance().getModel();
    const customer = sq.models['Customer'] || new CustomerRepo().getNewInstance().getModel();
    const customerUsers = sq.models['customer_users'] || new CustomerUsersRepo().getNewInstance().getModel()
    const machine = sq.models['Machine'] || new MachineRepo().getNewInstance().getModel()

    customer.belongsToMany(user, {'through': customerUsers});
    user.belongsToMany(customer, {'through': customerUsers});

    // Machines
    machine.belongsTo(customer, {'foreignKey':'customer_id'});
    customer.hasMany(machine, {'foreignKey':'customer_id'});
}

这个customerUsers是一个合适的模型

1 个答案:

答案 0 :(得分:2)

我在联接表上很幸运Bulk hooks。尝试在联接表的模型上使用beforeBulkCreatebeforeBulkUpdate

CustomerUser.addHook('beforeBulkCreate', 'admin-only', async function(customerUsers) {
  for (const customerUser of customerUsers) {
    const user = await User.findById(customer);
    if (user.isAdmin) { /* ... */ }
  }
}

显然这会产生大量的查询,你应该仔细考虑这个以及如何避免这种情况。