关联
在大多数情况下,hook 对于相关联的实例而言将是一样的,除了几件事情之外.
- 当使用 add/set 函数时,将运行 beforeUpdate/afterUpdate hook.
- 调用 beforeDestroy/afterDestroy hook 的唯一方法是与
onDelete:'cascade
和参数hooks:true
相关联. 例如:
class Projects extends Model {}
Projects.init({
title: DataTypes.STRING
}, { sequelize });
class Tasks extends Model {}
Tasks.init({
title: DataTypes.STRING
}, { sequelize });
Projects.hasMany(Tasks, { onDelete: 'cascade', hooks: true });
Tasks.belongsTo(Projects);
该代码将在Tasks表上运行beforeDestroy / afterDestroy. 默认情况下,Sequelize会尝试尽可能优化你的查询. 在删除时调用级联,Sequelize将简单地执行一个
DELETE FROM `table` WHERE associatedIdentifier = associatedIdentifier.primaryKey
然而,添加 hooks: true
会明确告诉 Sequelize,优化不是你所关心的,并且会在关联的对象上执行一个 SELECT
,并逐个删除每个实例,以便能够使用正确的参数调用 hook.
如果你的关联类型为 n:m
,则在使用 remove
调用时,你可能有兴趣在直通模型上触发 hook. 在内部,sequelize 使用 Model.destroy
,致使在每个实例上调用 bulkDestroy
而不是 before / afterDestroy
hook.
这可以通过将 {individualHooks:true}
传递给 remove
调用来简单地解决,从而导致每个 hook 都通过实例对象被删除.