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

