Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程

发布时间 - 2025-12-25 00:00:00    点击率:
Laravel 软删除通过标记 deleted_at 字段实现数据逻辑删除,需添加字段、引入 SoftDeletes trait 并设置 $dates 属性,delete() 方法自动填充 deleted_at,查询默认忽略已删除数据,withTrashed() 包含已删记录,onlyTrashed() 仅查已删数据,restore() 恢复,forceDelete() 永久删除,支持 restoring、restored 等事件监听,适用于需保留历史的数据场景。

在 Laravel 中,软删除(Soft Deleting)是一种让数据“看似”被删除,实则保留在数据库中的机制。它通过标记一条记录为已删除,而不是真正从数据库中移除,从而保留数据完整性,便于后续恢复或审计。Laravel 的 Eloquent ORM 提供了非常简洁的方式来实现软删除功能。

启用软删除功能

要在模型中启用软删除,需完成以下三个步骤:

  • 在对应的数据表中添加 deleted_at 字段
  • 在模型类中引入 Illuminate\Database\Eloquent\SoftDeletes trait
  • deleted_at 添加到模型的 $dates 属性中(可选,但推荐)

1. 修改数据库迁移文件

在创建表或修改表结构时,使用 softDeletes() 方法添加 deleted_at 字段:

Schema::table('users', function (Blueprint $table) {
    $table->softDeletes();
});

这会创建一个可为空的 deleted_at 时间戳字段。

2. 在模型中使用 SoftDeletes Trait

打开对应的 Eloquent 模型(如 User.php),引入 SoftDeletes:

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

class User extends Model
{
    use SoftDeletes;

    protected $dates = ['deleted_at'];
}

加入 $dates 后,deleted_at 会被自动转换为 PHP 的 Carbon 实例,方便日期操作。

软删除的使用方法

启用后,调用模型的 delete() 方法不会真正删除记录,而是填充 deleted_at 字段为当前时间。

  • $user->delete():触发软删除,设置 deleted_at
  • User::find($id):默认不返回已被软删除的记录
  • User::withTrashed()->find($id):包含已删除的记录
  • User::onlyTrashed()->get():仅查询已被软删除的记录
  • $user->restore():恢复已软删除的记录(清空 deleted_at)
  • $user->forceDelete():强制永久删除,绕过软删除

示例:

$user = User::find(1);
$user->delete(); // 软删除

// 查询包含已删除用户
User::withTrashed()->find(1);

// 恢复用户
$user->restore();

// 永久删除
$user->forceDelete();

查询作用域说明

Laravel 默认会在所有查询中自动添加 WHERE deleted_at IS NULL 条件,这就是为什么普通 find()get() 看不到已删除数据的原因。

你可以根据需要切换查询范围:

  • withoutTrashed():等同于默认行为,排除已删除数据
  • withTrashed():包含所有数据,无论是否删除
  • onlyTrashed():只获取已软删除的数据

恢复事件与清理

软删除和恢复操作会触发相应的 Eloquent 事件:

  • deletingdeleted:delete() 时触发(软或硬)
  • restoringrestored:restore() 时触发

你可以在模型中监听这些事件,执行额外逻辑:

protected static function booted()
{
    static::restored(function ($user) {
        // 用户被恢复时执行
        Log::info('User restored: ' . $user->id);
    });
}

基本上就这些。只要记得加字段、用 Trait、理解查询作用域,软删除用起来非常自然。日常开发中适合用于用户、文章、订单等需要保留历史记录的场景。


# php  # laravel  # ai  # 作用域  # 为什么  # red  # carbon  # NULL  # delete  # 事件  # database  # 数据库  # 你可以  # 已被  # 数据库中  # 是一种  # 这就是  # 适用于  # 会在  # 要在  # 可选  # 历史记录 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何处理表单验证?(Requests代码示例)  如何在腾讯云服务器上快速搭建个人网站?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  如何在阿里云ECS服务器部署织梦CMS网站?  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  如何获取免费开源的自助建站系统源码?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  网站制作壁纸教程视频,电脑壁纸网站?  如何快速搭建虚拟主机网站?新手必看指南  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  如何为不同团队 ID 动态生成多个“认领值班”按钮  利用 Google AI 进行 YouTube 视频 SEO 描述优化  怎么用AI帮你为初创公司进行市场定位分析?  如何破解联通资金短缺导致的基站建设难题?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel如何实现API版本控制_Laravel版本化API设计方案  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel如何创建自定义中间件?(Middleware代码示例)  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  如何在宝塔面板中创建新站点?  JavaScript如何实现错误处理_try...catch如何捕获异常?  EditPlus中的正则表达式实战(5)  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  如何在建站主机中优化服务器配置?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  高性价比服务器租赁——企业级配置与24小时运维服务  如何在阿里云完成域名注册与建站?  bing浏览器学术搜索入口_bing学术文献检索地址  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  网易LOFTER官网链接 老福特网页版登录地址  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  Laravel Fortify是什么,和Jetstream有什么关系  使用Dockerfile构建java web环境  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Python正则表达式进阶教程_复杂匹配与分组替换解析  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何在 React 中条件性地遍历数组并渲染元素  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  香港网站服务器数量如何影响SEO优化效果?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?