首页 > 解决方案 > 如何在异议模型的 $afterUpdate 挂钩中获取整个更新的条目?

问题描述

我使用 Objection.js 作为我的 ORM,用于一个简单的降雨应用程序。当较低级别的表已更新时,我需要能够动态更新和输入一个表。为此,我需要正在更新的整个条目,以便可以使用该数据正确更新动态更新的条目。

我使用$afterUpdate钩子来获取较低级别的表条目。我遇到的问题是,当我this$afterUpdate钩子函数中登录时,它只包含我要更新的条目部分的属性。我怎样才能获得整个条目?我确信我可以通过对数据库运行额外的查询来获得记录,但我希望能够避免这种情况。任何帮助,将不胜感激

标签: node.jspostgresqlobjection.js

解决方案


我认为,到目前为止,您只能通过额外的查询来获得整个模型。如果您使用实例查询 ($query) 进行更新,您可以从options.old.

询问:

const user = await User.query().findById(userId);
await user.$query()
          .patch({ name: 'Tom Jane' })

钩:

$afterUpdate(opt, queryContext) {
  console.log(opt.old)
}

修补

如果您不需要在钩子中执行此操作,您可能希望使用patch链接的函数first().returning('*')在单个查询中获取整个模型,它比patchAndFetchById在 postgreSQL 中更有效。如文档中所述。

因为 PostgreSQL(和其他一些)支持返回('*')链接,您实际上可以插入一行,或更新/修补/删除(一个)现有行,并接收受影响的行作为模型实例单一查询,从而提高效率。请参阅示例以获得更清晰的信息。

const jennifer = await Person
  .query()
  .patch({firstName: 'Jenn', lastName: 'Lawrence'})
  .where('id', 1234)
  .returning('*')
  .first();

参考:


推荐阅读