有没有办法在软删除时更新 "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 并且我假设它必须是 afterUpdate
或 afterDestroy
?
之一
如果有帮助,编辑添加模型:
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
不像用户定义的列那么容易,afterDestroy
和 beforeDestroy
挂钩需要 save()
或 update()
才能真正进行更改 - 猜测它们在设计时并没有真正考虑到能够更新字段。
解决方案是:
hooks: {
afterDestroy: async (instance) => {
instance.changed('updatedAt', true);
await instance.save();
}
}
已编辑 - 额外说明:调用 .changed()
将 updatedAt
设置为 deletedAt
的值是不可能的,因为在 beforeDestroy
和 [=12] =], deletedAt
的值仍然是 null
.
对于我的一个 models/tables,我通过将 paranoid
选项设置为 true
在 Sequelize 中定义了一个软删除,这给了我一个 deletedAt
列。
我还想确保 updatedAt
列也始终是最新的。 updatedAt
列是否可以在每次更改 deletedAt
时更新?我确实想将 paranoid
保留为 true
。
我已经使用 Sequelize 挂钩进行了调查:https://sequelize.org/master/manual/hooks.html 并且我假设它必须是 afterUpdate
或 afterDestroy
?
如果有帮助,编辑添加模型:
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
不像用户定义的列那么容易,afterDestroy
和 beforeDestroy
挂钩需要 save()
或 update()
才能真正进行更改 - 猜测它们在设计时并没有真正考虑到能够更新字段。
解决方案是:
hooks: {
afterDestroy: async (instance) => {
instance.changed('updatedAt', true);
await instance.save();
}
}
已编辑 - 额外说明:调用 .changed()
将 updatedAt
设置为 deletedAt
的值是不可能的,因为在 beforeDestroy
和 [=12] =], deletedAt
的值仍然是 null
.