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()

该软删除恢复方法会触发恢复前恢复后方法

 

 

 

 

原文链接:https://blog.ll00.cn/archives/147.html

posted @ 2020-08-09 11:53  不睡  阅读(5579)  评论(0编辑  收藏  举报