Laravel中的软删除(Soft Deletes)如何使用和恢复数据

发布时间 - 2025-11-16 00:00:00    点击率:
在 Laravel 中,软删除通过标记 deleted_at 字段实现数据可恢复性。需在迁移中添加 softDeletes() 字段并在模型中引入 SoftDeletes trait。调用 delete() 时设置 deleted_at 而非物理删除,默认查询不包含已删除记录。使用 withTrashed() 可查含已删数据,onlyTrashed() 仅查已删数据。通过 restore() 恢复数据,forceDelete() 则永久删除。适用于需保留历史或实现回收站功能的场景。

在 Laravel 中,软删除(Soft Deletes)是一种让数据“看似”被删除,但实际上保留在数据库中的机制。它通过标记一条记录为已删除,而不是真正从数据库中移除,从而实现数据的可恢复性。

启用软删除

要在模型中使用软删除,需要执行以下步骤:

  • 在对应的数据库迁移文件中添加 deleted_at 字段
  • 在模型类中引入 Illuminate\Database\Eloquent\SoftDeletes trait

例如,为 users 表添加软删除支持:

1. 创建迁移:

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

运行迁移后,会在 users 表中添加一个 deleted_at 时间戳字段。

2. 在模型中使用 SoftDeletes:

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

class User extends Model
{
    use SoftDeletes;
}

完成以上设置后,调用 $user->delete() 不会真正删除记录,而是将 deleted_at 设置为当前时间。

查询软删除的数据

默认情况下,Eloquent 查询不会返回已被软删除的记录。但你可以通过以下方式查看它们:

  • withTrashed():包含已删除的记录
  • onlyTrashed():只获取已删除的记录

示例:

// 获取所有用户,包括已删除的
$users = User::withTrashed()->get();

// 只获取已删除的用户
$trashedUsers = User::onlyTrashed()->get();

恢复软删除的数据

使用 restore() 方法可以将软删除的记录恢复,即将 deleted_at 字段清空。

示例:

// 恢复单个已删除用户
$user = User::onlyTrashed()->find(1);
$user->restore();

// 或链式调用
User::withTrashed()->where('id', 1)->restore();

你也可以在关联模型中恢复数据,只要该模型启用了软删除。

强制删除(彻底删除)

如果确实需要永久删除某条记录,可以使用 forceDelete() 方法:

$user->forceDelete();

这个操作不可逆,数据将从数据库中彻底移除。

基本上就这些。软删除适合需要保留历史数据或支持“回收站”功能的场景,合理使用能提升系统的安全性和用户体验。注意在做数据恢复时,确保业务逻辑正确处理状态变化。不复杂但容易忽略细节。


# laravel  # ai  # 数据恢复  # delete  # database  # 数据库  # 数据库中  # 链式  # 移除  # 恢复性  # 是一种  # 已被  # 适用于  # 会在  # 并在  # 要在 


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


相关推荐: 长沙做网站要多少钱,长沙国安网络怎么样?  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  Laravel如何与Pusher实现实时通信?(WebSocket示例)  如何在腾讯云免费申请建站?  详解MySQL数据库的安装与密码配置  开心动漫网站制作软件下载,十分开心动画为何停播?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  如何用搬瓦工VPS快速搭建个人网站?  如何在阿里云通过域名搭建网站?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel API资源类怎么用_Laravel API Resource数据转换  Laravel distinct去重查询_Laravel Eloquent去重方法  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  简单实现Android验证码  北京网站制作的公司有哪些,北京白云观官方网站?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  PHP正则匹配日期和时间(时间戳转换)的实例代码  如何快速搭建个人网站并优化SEO?  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  javascript读取文本节点方法小结  如何在建站之星网店版论坛获取技术支持?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  js实现点击每个li节点,都弹出其文本值及修改  Laravel如何创建自定义中间件?(Middleware代码示例)  Laravel怎么在Blade中安全地输出原始HTML内容  想要更高端的建设网站,这些原则一定要坚持!  Laravel如何使用模型观察者?(Observer代码示例)  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  微信小程序 require机制详解及实例代码  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  图册素材网站设计制作软件,图册的导出方式有几种?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  企业网站制作这些问题要关注  深圳网站制作平台,深圳市做网站好的公司有哪些?  Laravel storage目录权限问题_Laravel文件写入权限设置  如何用狗爹虚拟主机快速搭建网站?  Thinkphp 中 distinct 的用法解析  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  微信小程序 scroll-view组件实现列表页实例代码  javascript基于原型链的继承及call和apply函数用法分析  大型企业网站制作流程,做网站需要注册公司吗?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  移动端脚本框架Hammer.js  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  bing浏览器学术搜索入口_bing学术文献检索地址