• 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 appmodel;
    use thinkModel;
    
    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()

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

    原文:tp6模型事件的触发条件(详解)

  • 相关阅读:
    POJO,简单的Java对象
    Oracle 11g R2 for Win7旗舰版(64位)- 安装
    Eclipse安装与配置
    Tomcat 安装、配置与部署
    图形数据库 Neo4j 开发实战【转载】
    Java 语言中 Enum 类型的使用介绍【转载】
    IBM Java 7 新特性和在 WAS 8.5 中的配置【转载】
    为Eclipse指定JVM
    网页页面的宽度:950 还是 960?
    Zabbix + Grafana
  • 原文地址:https://www.cnblogs.com/yangfei123/p/15348222.html
Copyright © 2020-2023  润新知