关联

在大多数情况下,hook 对于相关联的实例而言将是一样的,除了几件事情之外.

  1. 当使用 add/set 函数时,将运行 beforeUpdate/afterUpdate hook.
  2. 调用 beforeDestroy/afterDestroy hook 的唯一方法是与 onDelete:'cascade 和参数 hooks:true 相关联. 例如:
  1. class Projects extends Model {}
  2. Projects.init({
  3. title: DataTypes.STRING
  4. }, { sequelize });
  5. class Tasks extends Model {}
  6. Tasks.init({
  7. title: DataTypes.STRING
  8. }, { sequelize });
  9. Projects.hasMany(Tasks, { onDelete: 'cascade', hooks: true });
  10. Tasks.belongsTo(Projects);

该代码将在Tasks表上运行beforeDestroy / afterDestroy. 默认情况下,Sequelize会尝试尽可能优化你的查询. 在删除时调用级联,Sequelize将简单地执行一个

  1. 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 都通过实例对象被删除.