详尽解析:如何在 Laravel 中实现软删除

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【8月更文挑战第31天】

在 Web 开发中,数据的安全性和完整性是非常重要的。软删除(Soft Delete)是一种常见的技术,它允许我们在数据库中保留已被“删除”的记录,而不是真正地从数据库中移除它们。通过这种方式,我们可以随时恢复这些记录,从而避免因误操作而导致的数据丢失。Laravel 框架提供了内置的支持来实现软删除,使得这一过程变得非常简单和高效。本文将详细介绍如何在 Laravel 中实现软删除,并通过具体示例来演示其使用方法。

一、软删除的基本概念

软删除是一种数据管理技术,它允许在数据库中保留被标记为“已删除”的记录,而不是物理删除这些记录。这样做的好处是:

  1. 数据恢复:即使数据被“删除”,也可以通过简单的操作恢复。
  2. 数据审计:可以跟踪哪些数据曾被删除,以及何时被删除。
  3. 数据一致性:避免因物理删除导致与其他表之间的外键约束问题。

在 Laravel 中,实现软删除非常简单,只需要在模型中使用 SoftDeletes Trait 即可。

二、软删除的实现步骤

要在 Laravel 中实现软删除,我们需要遵循以下步骤:

  1. 启用软删除:在模型中使用 SoftDeletes Trait。
  2. 定义时间戳字段:在数据库表中定义一个时间戳字段来记录删除时间。
  3. 使用软删除方法:使用 Laravel 提供的方法来执行删除和恢复操作。

三、启用软删除

在 Laravel 中,要启用软删除功能,需要在模型类中引入 SoftDeletes Trait。假设我们有一个 User 模型,我们可以在该模型中使用 SoftDeletes Trait:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model
{
   
    use SoftDeletes;
}

四、定义时间戳字段

为了记录删除的时间,我们需要在数据库表中定义一个时间戳字段。通常,这个字段被称为 deleted_at。在 Laravel 的迁移文件中,可以这样定义:

public function up()
{
   
    Schema::create('users', function (Blueprint $table) {
   
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamps(); // 创建 created_at 和 updated_at 字段
        $table->softDeletes(); // 添加 deleted_at 字段
    });
}

softDeletes() 方法会在表中添加一个 deleted_at 字段,用于记录删除时间。

五、使用软删除方法

一旦启用了软删除并在数据库表中定义了 deleted_at 字段,我们就可以使用 Laravel 提供的方法来执行软删除操作。

1. 删除记录

要删除一个记录,可以使用 delete() 方法。这不会真正从数据库中删除记录,而是将 deleted_at 字段设置为当前时间。

$user = User::find(1);
$user->delete();
2. 恢复记录

如果需要恢复一个已被软删除的记录,可以使用 restore() 方法。

$user = User::withTrashed()->where('id', 1)->first();
$user->restore();

withTrashed() 方法会从数据库中获取所有记录,包括已经被软删除的记录。

3. 彻底删除记录

如果需要彻底删除一个已被软删除的记录,可以使用 forceDelete() 方法。

$user = User::withTrashed()->where('id', 1)->first();
$user->forceDelete();

这个方法会从数据库中永久删除记录。

4. 获取被删除的记录

如果需要获取已被软删除的记录,可以使用 onlyTrashed() 方法。

$trashedUsers = User::onlyTrashed()->get();

这个方法只会获取那些已被软删除的记录。

六、示例:软删除在 Laravel 中的应用

下面通过一个具体的示例来演示如何在 Laravel 中使用软删除功能。

假设我们有一个 Post 模型,我们希望在删除帖子时不真正删除它们,而是将其标记为已删除。

  1. 定义模型
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
   
    use SoftDeletes;

    protected $fillable = ['title', 'content'];
}
  1. 创建迁移文件
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
   
    public function up()
    {
   
        Schema::create('posts', function (Blueprint $table) {
   
            $table->increments('id');
            $table->string('title');
            $table->text('content');
            $table->timestamps();
            $table->softDeletes();
        });
    }

    public function down()
    {
   
        Schema::dropIfExists('posts');
    }
}
  1. 执行删除操作
$post = Post::find(1);
$post->delete();
  1. 恢复记录
$post = Post::withTrashed()->where('id', 1)->first();
$post->restore();
  1. 获取已删除的记录
$trashedPosts = Post::onlyTrashed()->get();
  1. 彻底删除记录
$post = Post::withTrashed()->where('id', 1)->first();
$post->forceDelete();

七、软删除的注意事项

  1. 查询结果:默认情况下,all()get() 方法不会返回已被软删除的记录。如果需要获取所有记录,包括已被删除的,可以使用 withTrashed() 方法。
  2. 性能考虑:软删除会增加数据库表的复杂性和查询的开销。在处理大量数据时,需要权衡是否使用软删除。
  3. 安全性:软删除的记录仍然存在于数据库中,因此需要确保只有授权用户可以访问或恢复这些记录。

八、总结

软删除是 Laravel 提供的一个非常实用的功能,它使得数据管理更加灵活和安全。通过本文的介绍,相信读者已经掌握了在 Laravel 中实现软删除的基本方法。软删除不仅可以避免数据的永久丢失,还能提高数据的完整性和安全性。希望本文能够帮助开发者更好地理解和应用 Laravel 的软删除功能,从而构建高效、稳定的 Web 应用程序。

目录
相关文章
|
2月前
|
开发工具 git 开发者
内核维护者手册 - 处理混乱的拉取请求差异统计【ChatGPT】
内核维护者手册 - 处理混乱的拉取请求差异统计【ChatGPT】
|
6月前
|
编解码
亚丁号自动阅读第一次更新
亚丁号自动阅读第一次更新
44 1
|
缓存 中间件 PHP
最为常用的Laravel操作(2)-路由
整理了 Laravel 框架路由最常用的操作,如路由参数、路由群组、中间件等。本系列共有 3 篇文章。
70 0
|
6月前
|
JavaScript 前端开发
5款MicrosoftEdge扩展推荐(亲测有用 极力推荐
5款MicrosoftEdge扩展推荐(亲测有用 极力推荐
184 0
5款MicrosoftEdge扩展推荐(亲测有用 极力推荐
|
6月前
|
前端开发
问题解答:SAP UI5 应用设置禁止被其他应用嵌入运行的工作原理解析试读版
问题解答:SAP UI5 应用设置禁止被其他应用嵌入运行的工作原理解析试读版
|
11月前
|
程序员 API 开发者
自动化脚本如何编写?打算写个自动发布文章的脚本教程
作为一名程序员/开发者,我们经常需要处理重复性的任务,比如发布文章到多个媒体平台。为了提高效率,我们可以编写自动化脚本来完成这些任务。本文将介绍如何使用万媒易发多平台内容同步助手来自动发布文章。
|
PHP 索引
最为常用的Laravel操作(3)-模板
整理了 Laravel 框架模板最常用的操作,如模板常用语法、模板继承、流程控制、循环等。本系列共有 3 篇文章。
71 0
|
JSON 测试技术 数据格式
2022/9/5开始第三版接口自动化(yaml用例)测试框架(记录搭建过程)(这个废弃了)
2022/9/5开始第三版接口自动化(yaml用例)测试框架(记录搭建过程)(这个废弃了)
|
BI 数据处理 Scala
报表统计_执行框架_旧模块改造 | 学习笔记
快速学习报表统计_执行框架_旧模块改造
112 0
报表统计_执行框架_旧模块改造 | 学习笔记
|
数据采集 监控 数据可视化
功能介绍补充|学习笔记
快速学习功能介绍补充
功能介绍补充|学习笔记