最近刚好用上模型事件,但手册上对事件的触发条件却没有详细的进行说明。那么,就只能自己进行测试了。
首先,从手册上,我们可以知道模型支持以下事件:
| 事件 | 描述 | 事件方法名 |
|---|---|---|
| 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 |
为了了解每个事件的触发条件,我们先建立以下模型:
<?php namespace app\model; use think\Model; class Article extends Model { public static function onAfterRead($user) { // 查询后:每次执行就查询一条数据 dump(‘查询后‘); // halt($user); } public static function onBeforeInsert($user) { // 新增前:获取的新增数据,还没新增 dump(‘新增前‘); // halt($user->toArray()); } public static function onAfterInsert($user) { // 新增后:获取的新增数据,已经新增数据 dump(‘新增后‘); // halt($user->toArray()); } public static function onBeforeUpdate($user) { // 更新前:获取的更新数据,还没更新数据 dump(‘更新前‘); // halt($user->toArray()); } public static function onAfterUpdate($user) { // 更新后:获取的更新数据,已经更新数据 dump(‘更新后‘); // halt($user->toArray()); } public static function onBeforeWrite($user) { // 写入前:获取的当前数据,还没新增、更新 dump(‘写入前‘); // halt($user->toArray()); } public static function onAfterWrite($user) { // 写入后:获取的当前数据 dump(‘写入后‘); // halt($user->toArray()); } public static function onBeforeDelete($user) { // 删除前:获取的删除前数据,还没删除 dump(‘删除前‘); // halt($user->toArray()); } public static function onAfterDelete($user) { // 删除后:获取的删除数据,已经删除 dump(‘删除后‘); } public static function onBeforeRestore($user) { dump(‘恢复前‘); } public static function onAfterRestore($user) { dump(‘恢复后‘); } }
然后通过以下代码去操作数据库:
public function demo9(Article $model){ $date = [ ‘id‘=>7, ‘title‘=>‘test3‘, ‘content‘=>‘333333333333‘, ]; // 查询后:数据有多少条onAfterRead就执行多少次,我的数据有9条,所有执行9次 $model::select(); //写入前、新增前、新增后、写入后 $model::create($date); //写入前、新增前、新增后、写入后 $model->save($date); //查询后、写入前、更新前、写入后、更新后 $art = $model::find(7); $art->save($date); //写入前、更新前、更新后、更新后 $model->update($date); //没有触发 $model::where(‘id‘,11)->delete(); //没有触发 $model->insert($date); //查询后、删除前、删除后 $art = $model::find(9); $art->delete(); //查询后、删除前、删除后 $model::destroy(13); }
模型创建数据方法,会触发写入前、新增前、新增后、写入后。使用模型的save()和saveAll()来新增方法也会触发这几个事件。
insert()是Db类的方法,不是模型方法,不会触发模型事件。
update()模型方法,写入前、更新前、更新后、写入后。
使用模型的save()方法来更新数据,会触发写入前、更新前、更新后、写入后事件。
如果是使用模型方法查询出来数据,然后再删除数据,则会触发删除前、删除后事件。
如果是直接使用条件删除,则不会触发模型事件。因为直接使用条件删除,这时候的delete()方法不是模型方法。
该查询方法会触发查询后事件
该删除数据方法会触发查询后、删除前、删除后。所以,该方法是先查询出数据,然后再删除该数据。
该软删除恢复方法会触发恢复前、恢复后方法
原文:https://www.cnblogs.com/bushui/p/13462104.html