模型的刪除和數據庫的刪除方法區別在于,模型的刪除會包含模型的事件處理。
## 刪除當前模型
刪除模型數據,可以在查詢后調用`delete`方法。
~~~
$user = User::find(1);
$user->delete();
~~~
> `delete`方法返回布爾值
## 根據主鍵刪除
或者直接調用靜態方法(根據主鍵刪除)
~~~
User::destroy(1);
// 支持批量刪除多個數據
User::destroy([1,2,3]);
~~~
>[danger] 當`destroy`方法傳入空值(包括空字符串和空數組)的時候不會做任何的數據刪除操作,但傳入0則是有效的
## 條件刪除
還支持使用閉包刪除,例如:
~~~
User::destroy(function($query){
$query->where('id','>',10);
});
~~~
或者通過數據庫類的查詢條件刪除
~~~
User::where('id','>',10)->delete();
~~~
>[danger] 直接調用數據庫的`delete`方法的話無法調用模型事件。
## 軟刪除
?
在實際項目中,對數據頻繁使用刪除操作會導致性能問題,軟刪除的作用就是把數據加上刪除標記,而不是真正的刪除,同時也便于需要的時候進行數據的恢復。
?
要使用軟刪除功能,需要引入`SoftDelete` trait,例如`User`模型按照下面的定義就可以使用軟刪除功能:
?
~~~
<?php
namespace app\model;
?
use think\Model;
use think\model\concern\SoftDelete;
?
class User extends Model
{
use SoftDelete;
protected $deleteTime = 'delete_time';
}
~~~
?
`deleteTime`屬性用于定義你的軟刪除標記字段,`ThinkORM`的軟刪除字段使用時間類型,用于記錄數據的刪除時間。可以使用`defaultSoftDelete`屬性來定義軟刪除字段的默認值,沒有設置的話默認值為`Null`。
?
~~~
<?php
namespace app\model;
?
use think\Model;
use think\model\concern\SoftDelete;
?
class User extends Model
{
use SoftDelete;
protected $deleteTime = 'delete_time';
protected $defaultSoftDelete = 0;
}
~~~
?
> 可以用類型轉換指定軟刪除字段的類型,建議數據表的所有時間字段統一一種類型。
?
定義好模型后,我們就可以使用:
?
~~~
// 軟刪除
User::destroy(1);
// 真實刪除
User::destroy(1,true);
?
$user = User::find(1);
// 軟刪除
$user->delete();
// 真實刪除
$user->force()->delete();
~~~
?
默認情況下查詢的數據不包含軟刪除數據,如果需要包含軟刪除的數據,可以使用下面的方式查詢:
?
~~~
User::withTrashed()->find();
User::withTrashed()->select();
~~~
?
如果僅僅需要查詢軟刪除的數據,可以使用:
~~~
User::onlyTrashed()->find();
User::onlyTrashed()->select();
~~~
?
恢復被軟刪除的數據
~~~php
$user = User::onlyTrashed()->find(1);
$user->restore();
~~~
?
>[danger] 軟刪除的刪除操作僅對模型的刪除方法有效,如果直接使用數據庫的刪除方法則無效,例如下面的方式無效。
?
~~~
$user = new User;
$user->where('id',1)->delete();
~~~
?
## 最佳實踐
>[info] 刪除的最佳實踐原則是:如果刪除當前模型數據,用`delete`方法,如果需要直接刪除數據,使用`destroy`靜態方法。
- 簡介
- 數據庫配置
- 分布式數據庫
- 查詢構造器
- 查詢數據
- 新增數據
- 更新數據
- 刪除數據
- 鏈式操作
- Where
- Table
- Alias
- Field
- Strict
- Limit
- Page
- Order
- Group
- Having
- Join
- Union
- Distinct
- Lock
- Cache
- Comment
- FetchSql
- Force
- Partition
- Replace
- FailException
- Extra
- Duplicate
- Sequence
- Procedure
- View
- 聚合查詢
- 分頁查詢
- 時間查詢
- 高級查詢
- 子查詢
- 原生查詢
- 事務操作
- 存儲過程
- 查詢事件
- JSON字段
- 模型
- 定義
- 新增
- 更新
- 刪除
- 查詢
- 查詢范圍
- 只讀字段
- JSON字段
- 自動時間寫入
- 獲取器
- 修改器
- 搜索器
- 類型轉換
- 模型輸出
- 模型事件
- 虛擬模型
- 關聯
- 一對一關聯
- 一對多關聯
- 遠程一對多
- 遠程一對一
- 多對多關聯
- 多態一對多
- 多態一對一
- 關聯預載入
- 關聯統計
- 關聯輸出
- SQL監聽
- 緩存機制
- 字段緩存
- 查詢緩存
- 擴展
- 自定義查詢類
- 自定義數據庫驅動