【问题标题】:Is there a way to update "updatedAt" field on soft delete?有没有办法在软删除时更新“updatedAt”字段?
【发布时间】:2022-10-20 15:56:05
【问题描述】:

对于我的一个模型/表,我通过将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,但显然不是这样。

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

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

    解决方案是:

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

    已编辑 - 额外说明:调用.changed()updatedAt 设置为deletedAt 的值是不可能的,因为在beforeDestroyafterDestroy 的时候,deletedAt 的值仍然是null

    【讨论】:

      【解决方案2】:

      出于好奇而跟进...您不能执行以下操作来更新挂钩的deletedAt 的值吗?:

      hooks: {
              afterDestroy: async (instance, options) => {
                  // instance.changed('destroy', true);
                  // await instance.save();
                  instance.deletedAt = new Date().toISOString().replace(/T/, ' ').replace(/..+/g, '');
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-27
        • 2021-06-28
        • 2019-06-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多