ThinkPHP数据软删除及数据恢复功能

  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.html

王冰冰不能结婚离婚吗?谁规定的?
上一篇 2022-01-24
国足1比3惨败越南,阿猫阿狗都能进国家队?
下一篇 2022-02-02

评论列表(0条)

  • 暂无评论

发表评论

captcha

相关推荐

  • PHP隐藏文件真实下载地址防盗链功能

      这个方案核心是隐藏文件真实地址,文件存放在网站根目录外(无法直接HTTP访问),或用权限锁定,只允许PHP。读取用动态临时下载链接替代,定时随机变更链接,随机密钥不可预测,过期自动失效。   校验来源域名、IP地址、链接有效期、签名,彻底防止盗链、批量下载、服务器过载。单IP限速、单文件并发下载限制、错误次数锁定,防止服务器过载。PHP代理输出文件,支持大文件断点续传   1.配置文件(config.php)统一管理密钥、有效期、限......

    2013-12-06
    21440
  • PHP图片验证码功能简单开发

      验证码是网站开发中常用的功能,可以保证用户提交数据和服务器的安全,验证码的形态也是千奇百怪,从传统的数字+字母,到拼图,再到找元素等等越来越复杂。   今天说一下用PHP原生开发方式如何写一个最常见的数字+字母图片验证码功能,过程非常简单。   首先创建验证码生成文件verify.php &lt;?php // 开启session session_start(); // 创建图片资源,宽高 $img = imagecreatetru......

    2014-08-02
    21070
  • jQuery Ajax无刷新数据增删改查功能

      一套简单的无刷新数据增删改查功能,基于jQuery Ajax异步请求技术,后端使用PHP处理数据并返回结果给前端,实现页面无刷新,不跳转对数据增删改查操作。   index.html &lt;!DOCTYPE html&gt; &lt;html lang="zh-CN"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;AJAX 无刷新增删改查&lt;/t......

    2014-11-16
    20100
  • Layui + jQuery无刷新增删改查功能

      使用Layui框架可以让后台管理功能开发更高效,UI风格更统一美观。简单介绍一下Layui+jQuery开发无刷新数据操作功能的原理,支持数据查询,增加,修改,删除(包括批量删除)。   index.html &lt;!DOCTYPE html&gt; &lt;html lang="zh-CN"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;Layui......

    2018-09-14
    19930
  • ThinkPHP数据库操作(Db)与模型操作(Model)区别

      Db类数据操作:性能略高一些,语法简单直观,但是不支持自动处理数据,自动验证,关联查询等功能,适合简单数据操作。 use think\facade\Db; // 查询 Db::table('user')-&gt;where('id', 1)-&gt;find(); // 新增 Db::table('user')-&gt;insert([ 'name' =&gt; '张三', 'age' =&gt; 20 ]); ......

    2019-12-02
    18300
  • ThinkPHP多入口文件多应用设置方法

      在使用ThinkPHP做项目开发时,为了让架构更清晰科学,提高安全和性能,方便维护,需要将多应用分配到各自对应的不同的入口文件上,而不是整个项目用一个入口文件。   此方法适用于ThinkPHP6/8,这是ThinkPHP默认的单应用结构: ├─app 应用目录 │ ├─controller 控制器目录 │ ├─model 模型目录 │ ├─view 视图目......

    2024-03-31
    8290
  • ThinkPHP获取数据库类型和版本的方法

      在开发后台功能时,可能会需要自动获取当前使用的数据库类型和版本的情况,下面就举个简单的例子实现自动获取当前项目使用的是MySQL还是SQLite数据库及使用的相应数据库版本的方法: // 数据库类型 $default = config('database.default'); $config = config('database.connections.' . $default); $db_type = strtolower(tri......

    2024-11-02
    8890
  • ThinkPHP路由简单配置

      ThinkPHP拥有丰富的路由配置功能,灵活的配置路由可以更好的优化URL结构,方便维护,下面简单介绍一下ThinkPHP路由配置方法。   ThinkPHP默认路由结构为/入口文件/应用/控制器/方法,因此就产生了这样一长串的URL结构: https://127.0.0.2/index.php/index/index/index   这还仅仅是首页URL,这样的结构显然不利于维护,更不利于SEO,所以需要做路由配置,以多应用为例,......

    2025-04-21
    7490