Sequelize - 在具有onDelete Cascade的实例上调用beforeDestroy钩子

时间:2017-06-29 11:47:36

标签: sequelize.js

我有一个涉及两个表(一对多)的场景,用户可以从第一个表(name:document,relationship:one)中删除记录或记录数组,然后关联记录从我的第二个表(名称:文件,关系:很多)到该表将被删除。 &{34;文件"上的onDelete级联表正在按预期工作,但我的钩子永远不会触发。

  • 我是否需要在.destroy续集中的某个地方调用挂钩 方法
  • 因为我的关系是一对多的,用户可以拥有多个 文件或一个文件的单个文件,我需要添加钩子 beforeDestroybeforeBulkDestroy

以下是两个表之间的关联:

文档

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
    }
});

2 个答案:

答案 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),

当然,这可能是密集的,可能不是我们想要的行为。