ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 模型事件 模型事件是指在进行模型的查询和写入操作的时候触发的操作行为。 >[danger] 模型事件只在调用模型的方法生效,使用查询构造器操作是无效的 模型支持如下事件: |事件|描述|事件方法名| |---|---|---| |after_read | 查询后 |onAfterRead| |before_insert | 新增前 |onBeforeInsert| |after_insert | 新增后 |onAfterInsert| |before_update | 更新前 |onBeforeUpdate| |after_update| 更新后 |onAfterUpdate| |before_write| 写入前 |onBeforeWrite| |after_write | 写入后 |onAfterWrite| |before_delete | 删除前 |onBeforeDelete| |after_delete | 删除后 |onAfterDelete| |before_restore | 恢复前 |onBeforeRestore| |after_restore | 恢复后 |onAfterRestore| 注册的回调方法支持传入一个参数(当前的模型对象实例),但支持依赖注入的方式增加额外参数。 >[info] 如果`before_write`、`before_insert`、 `before_update` 、`before_delete`事件方法中返回`false`或者抛出`think\exception\ModelEventException`异常的话,则不会继续执行后续的操作。 ## 模型事件定义 最简单的方式是在模型类里面定义静态方法来定义模型的相关事件响应。 ~~~ <?php namespace app\model; use think\Model; use app\model\Profile; class User extends Model { public static function onBeforeUpdate($user) { if ('thinkphp' == $user->name) { return false; } } public static function onAfterDelete($user) { Profile::destroy($user->id); } } ~~~ 参数是当前的模型对象实例,支持使用依赖注入传入更多的参数。 ## 写入事件 `onBeforeWrite`和`onAfterWrite`事件会在`新增`操作和`更新`操作都会触发. 具体的触发顺序: ``` // 执行 onBeforeWrite // 如果事件没有返回`false`,那么继续执行 // 执行新增或更新操作(onBeforeInsert/onAfterInsert或onBeforeUpdate/onAfterUpdate) // 新增或更新执行成功 // 执行 onAfterWrite ``` > 注意:模型的新增或更新是自动判断的.