ThinkPHP的软删除不是真正删除数据库数据,而是通过标记字段(如delete_time)记录删除状态,查询时自动过滤delete_time字段已标记删除的数据,支持数据恢复和真实删除,相当于为项目加了一个回收站功能,以避免数据被误删。
软删除依赖模型操作,不支持原生查询,需要数据表有删除标记字段(默认delete_time,类型:datetime/timestamp,允许null),需要引入ThinkPHP内置的SoftDelete trait。
创建数据表
示例用户表user,必须包含delete_time字段:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '用户名',
`age` int(3) DEFAULT NULL COMMENT '年龄',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`delete_time` datetime DEFAULT NULL COMMENT '软删除标记(NULL=未删除)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
创建模型
在app/model/User.php中编写模型,引入软删除trait:
<?php
namespace app\model;
use think\Model;
use think\model\concern\SoftDelete;
class User extends Model
{
// 引入软删除trait
use SoftDelete;
// 软删除标记字段 默认是 delete_time
// protected $deleteTime = 'delete_time';
// 软删除默认值(NULL表示未删除)
protected $defaultSoftDelete = 0;
}
软删除、恢复、真实删除
创建控制器app/controller/User.php:
<?php
namespace app\controller;
use app\model\User;
use think\Request;
class UserController
{
// 软删除数据(只标记,不真实删除)
public function softDelete($id)
{
// 根据ID查询数据
$user = User::find($id);
if (!$user) {
return '数据不存在';
}
// 执行软删除
$user->delete();
return '软删除成功';
}
// 查询正常的数据(自动过滤软删除数据)
public function getList()
{
// 自动忽略 delete_time 不为 NULL 的数据
$list = User::select();
return json($list);
}
// 查询包含软删除的所有数据
public function getAllList()
{
// withTrashed():包含已软删除的数据
$list = User::withTrashed()->select();
return json($list);
}
// 仅查询已软删除的数据
public function getDeletedList()
{
// onlyTrashed():只查询已软删除的数据
$list = User::onlyTrashed()->select();
return json($list);
}
// 恢复软删除的数据
public function restore($id)
{
// 必须用 withTrashed() 才能查到已删除的数据
$user = User::withTrashed()->find($id);
if (!$user) {
return '数据不存在';
}
// 恢复数据(delete_time 置为 NULL)
$user->restore();
return '数据恢复成功';
}
// 真实删除数据(彻底从数据库删除)
public function trueDelete($id)
{
// 必须用 withTrashed() 才能查到已删除的数据
$user = User::withTrashed()->find($id);
if (!$user) {
return '数据不存在';
}
// 真实删除(无法恢复)
$user->force()->delete();
return '真实删除成功';
}
}
本站原创内容,转载请注明来源:https://www.liutonghui.com/201
评论列表(0条)
暂无评论