关联(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。尝试在连接表的模型上使用 beforeBulkCreate
和 beforeBulkUpdate
。
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缺少字段