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

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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 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年前 评论

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