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 事件:
- deleting 和 deleted:delete() 时触发(软或硬)
- restoring 和 restored: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?


,forceDelete() 永久删除,支持 restoring、restored 等事件监听,适用于需保留历史的数据场景。