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()
該軟刪除恢復方法會觸發恢復前
、恢復后
方法