我有一个涉及两个表(一对多)的场景,用户可以从第一个表(name:document,relationship:one)中删除记录或记录数组,然后关联记录从我的第二个表(名称:文件,关系:很多)到该表将被删除。 &{34;文件"上的onDelete
级联表正在按预期工作,但我的钩子永远不会触发。
.destroy
续集中的某个地方调用挂钩
方法beforeDestroy
和beforeBulkDestroy
?以下是两个表之间的关联:
文档
var Document = sequelize.define('document', {
...
},
{
underscored: true,
freezeTableName: true,
classMethods: {
associate: function(db) {
Document.hasMany(db.File, { foreignKey: 'document_id'}),
}
}
});
return Document;
文件
var File = sequelize.define('file', {
...
},{
underscored: true,
freezeTableName: true,
hooks: {
beforeDestroy: function(whereClause, fn){
//options.individualHooks = true;
console.log('whereClause Start');
console.log(whereClause);
console.log('fn start');
console.log(fn);
},
beforeBulkDestroy: function(whereClause, fn) {
//options.individualHooks = true;
console.log('whereClause Start');
console.log(whereClause);
console.log('fn start');
console.log(fn);
}
},
classMethods: {
associate: function(db) {
File.belongsTo(db.Document, { onDelete: 'CASCADE', hooks: true});
}
}
});
return File;
仅限Sequelize触发器场景:
models.Document.destroy({
where: {
userId: req.user.userId,
documentId: documentId //Replace with array in certain instances
}
});
答案 0 :(得分:0)
我面临着同样的问题。因为文档(v5):
注意:不能对实例使用钩子。挂钩用于模型。
和
实例挂钩:每当您编辑单个对象
时,都会发出以下挂钩
给出了非常混杂的观点,我决定不破坏实例models.Document.destroy(where)
,而是破坏模型(先选择模型再选择document.destroy()
)。这样做时会钩住钩子。
当您现在使用cascades
时,Sequelize(v5)似乎无法调用挂钩。
答案 1 :(得分:0)
Model.destroy()
方法默认不调用 beforeDestroy
钩子。您可以使用 individualHooks: true
选项强制它这样做,就像这样
models.Document.destroy({
where: {
userId: req.user.userId,
documentId: documentId //Replace with array in certain instances
},
individualHooks: true
})
见:
https://github.com/sequelize/sequelize/issues/10270
https://sequelize.org/master/manual/hooks.html#model-hooks
如果您愿意,您也可以在此模型上进行任何批量销毁,以始终触发单个钩子。这可以通过 beforeBulkDestroy
钩子完成:
beforeBulkDestroy: async (options) =>
(options.individualHooks = true),
当然,这可能是密集的,可能不是我们想要的行为。