如何监听并记录数据库修改?

我想做一个基于记录数据库修改的日志模块,并且与系统松耦合。目前实现了通过监听数据库事件,来获得当前请求中执行的所有 Sql 语句,但是我还想在数据库修改操作发生时,记录下修改前和修改后的数据模型状态。那么问题来了,该如何在数据库修改发生时,获得并记录修改前的状态呢?
数据库事件是在事件发生之后再进行记录的,并不满足这一需求,我想到重写 Model 的方法,但是项目的大部分数据库修改操作都不是直接操作 Model,而是生成 Builder 再 update,还有没有其他办法?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7

序列化模型试试呢

6年前 评论

@听风 能不能解释一下流程?

6年前 评论

记录数据模型状态是什么目的?
https://github.com/ScoLib/laravel-action-l... 这是我写的一个扩展,用的事件机制

6年前 评论

@klgd 监听模型状态的改变就能自动记录关键表的修改操作,我看了一下您的代码,依然只适应直接对模型操作的情况,如:Class AModel extends Model;只适用:$a = AModel::where('id', 5)->first();$a->update([]); 不适用:AModel::where('id', 5)->update([]); 。但是当前我的项目中几乎所有的更新操作都是用后面这种方式,不知该如何实现监听事件的效果

6年前 评论
leo

如果要记录更新前的数据,那还是通过binlog那一层,纯php难搞

6年前 评论

@klgd 现在我已经用了这个 DB::listen,但是它只能记录数据库 sql 记录而不能记录模型修改,我再去试一下AModel::where('id', 5)->update([]);这种方式能否触发一两个 Eloquent 事件,好像也没有别的解决办法了

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!