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

Posted

技术标签:

【中文标题】关联(pivot,belongsToMany)中的续集挂钩(afterCreate.afterUpdate)不起作用【英文标题】:Sequelize hooks (afterCreate. afterUpdate) in association (pivot, belongsToMany) not working 【发布时间】:2017-03-22 16:32:44 【问题描述】:

我正在构建一个使用 Sequelize 作为 ORM 的 API。我想在核心逻辑中加入一些“侦听器”,以检查某些值是否已更改并基于此触发一些逻辑。

我主要关心的一个问题是客户和用户之间的数据透视表。 (属于许多人)。该关系在数据透视表中有一些额外的字段,例如“is_admin”或“notify_user”。这描述了用户是某个客户的管理员,以及系统是否应通知该用户有关客户的操作。

我的 API 支持数据透视表数据的 PATCHING。现在我想做的是,如果 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 是一个合适的模型

【问题讨论】:

您的belongsToMany 关联是如何定义的?您的数据透视表是正确的模型还是只是在关联配置中定义为字符串? 我将编辑上面的问题 你能展示一个不起作用的钩子吗? 【参考方案1】:

我很幸运在连接表上使用了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)  /* ... */ 
  

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

【讨论】:

以上是关于关联(pivot,belongsToMany)中的续集挂钩(afterCreate.afterUpdate)不起作用的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp5 的 belongsToMany 多对多关联用法

在 CakePHP 3 中保存 belongsToMany 关联

Laravel Custom Pivot Model缺少字段

加入belongsToMany并获取所有列

在 sequelize.js 中获取与 belongsToMany 的关联

Sequelize Find belongsToMany 关联