有没有办法在软删除时更新 "updatedAt" 字段?

Is there a way to update "updatedAt" field on soft delete?

对于我的一个 models/tables,我通过将 paranoid 选项设置为 true 在 Sequelize 中定义了一个软删除,这给了我一个 deletedAt 列。

我还想确保 updatedAt 列也始终是最新的。 updatedAt 列是否可以在每次更改 deletedAt 时更新?我确实想将 paranoid 保留为 true

我已经使用 Sequelize 挂钩进行了调查:https://sequelize.org/master/manual/hooks.html 并且我假设它必须是 afterUpdateafterDestroy?

之一

如果有帮助,编辑添加模型:

module.exports = (sequelize, DataTypes) => sequelize.define('myTable', {
  id: {
    type: DataTypes.INTEGER,
    allowNull: false,
    primaryKey: true,
    autoIncrement: true,
    allowNull: true,
  },

  /* some more fields... */
  
  deletedAt: {
    type: DataTypes.DATE,
    allowNull: true,
  },
  createdAt: {
    type: DataTypes.DATE,
    allowNull: false,
  },
  updatedAt: { // <- want this to reflect updates on deletedAt too
    type: DataTypes.DATE,
    allowNull: false,
  },
}, {
  paranoid: true,
  timestamps: true,
  /* Added the following: */
  hooks: {
    afterBulkDestroy(item) {
      console.log(item);
    }
  }
});

UDPATE:尝试添加 afterBulkDestroy,打印出 item 后显示:

{
  where: { id: '12' },
  hooks: true,
  individualHooks: false,
  force: false,
  cascade: false,
  restartIdentity: false,
  type: 'BULKDELETE',
  model: myTable
}

不知道从这里到哪里 - 以为我可以做一个简单的 item.updatedAt = item.deletedAt 但显然不是这样。

找到了一种不太优雅但可行的方法。手动设置 updatedAt 不像用户定义的列那么容易,afterDestroybeforeDestroy 挂钩需要 save()update() 才能真正进行更改 - 猜测它们在设计时并没有真正考虑到能够更新字段。

解决方案是:

hooks: {
  afterDestroy: async (instance) => {
    instance.changed('updatedAt', true);
    await instance.save();
  }
}

已编辑 - 额外说明:调用 .changed()updatedAt 设置为 deletedAt 的值是不可能的,因为在 beforeDestroy 和 [=12] =], deletedAt 的值仍然是 null.