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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM