tp6模型事件的触发条件(详解)
Thinkphp6模型事件类似于Vue的钩子函数,方便我们在增、删、查、改这个时间段进行操作
模型事件
首先,从手册上,我们可以知道模型支持以下事件:
事件 | 描述 | 事件方法名 |
---|---|---|
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){ // 查询后:数据有多少条onAfterRead就执行多少次,我的数据有9条,所有执行9次 $model::select(); //写入前、新增前、新增后、写入后 $model::create([ 'title'=>'test1', 'content'=>'111111111111111', ]); //写入前、新增前、新增后、写入后 $model->save([ 'title'=>'test2', 'content'=>'22222222222', ]); //查询后、写入前、更新前、写入后、更新后 $art = $model::find(7); $art->save([ 'title'=>'test3', 'content'=>'33333333333333', ]); //写入前、更新前、更新后、写入后 $model->update([ 'id'=>8, 'title'=>'test4', 'content'=>'4444444444444', ]); //没有触发 $model::where('id',11)->delete(); //没有触发 $model->insert([ 'title'=>'test1', 'content'=>'111111111111', ]); //没有触发 $model->where('id',8)->update([ 'title'=>'test4', 'content'=>'4444444444444', ]); //查询后、删除前、删除后 $art = $model::find(9); $art->delete(); //查询后、删除前、删除后 $model::destroy(13); }
如果你想获取以前的数据进行对比,使用getOrigin:
public static function onAfterUpdate($user) { $origin = $user->getOrigin("category");//以前数据 $category = $user['category'];//当前的数据 if ($origin != $category) { //操作 } }
总结
create()
模型创建数据方法,会触发写入前
、新增前
、新增后
、写入后
。使用模型的save()
和saveAll()
来新增方法也会触发这几个事件。
insert()
insert()
是Db类的方法,不是模型方法,不会触发模型事件。
update()
update()
模型方法,写入前、更新前、更新后、写入后。
如果是直接使用条件更新,则不会触发模型事件。因为直接使用条件更新,这时候的update()
方法不是模型方法。
save()
使用模型的save()
方法来更新数据,会触发写入前
、更新前
、更新后
、写入后
事件。
delete()
如果是使用模型方法查询出来数据,然后再删除数据,则会触发删除前
、删除后
事件。
如果是直接使用条件删除,则不会触发模型事件。因为直接使用条件删除,这时候的delete()
方法不是模型方法。
find()
该查询方法会触发查询后
事件
destroy()
该删除数据方法会触发查询后
、删除前
、删除后
。所以,该方法是先查询出数据,然后再删除该数据。
restore()
该软删除恢复方法会触发恢复前
、恢复后
方法