我正在使用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是一个合适的模型
最佳答案 我在连接表上幸运地获得了 Bulk hooks.尝试在连接表的模型上使用beforeBulkCreate和beforeBulkUpdate.
CustomerUser.addHook('beforeBulkCreate', 'admin-only', async function(customerUsers) {
for (const customerUser of customerUsers) {
const user = await User.findById(customer);
if (user.isAdmin) { /* ... */ }
}
}
显然这会产生大量的查询,你应该仔细考虑这个以及如何避免这种情况.