讲师中心 微信公众号
AI工具推荐 视频效率加速

PHP增删改查怎么实现软删除_php软删除代码【设计】

胖婷吖_9443

胖婷吖_9443

发布时间:2025-12-24 16:31:18

|

567人浏览过

|

来源于php中文网

原创

PHP软删除可通过四种方法实现:一、Eloquent的SoftDeletes Trait配合deleted_at字段;二、手动维护is_deleted布尔字段;三、用作用域统一过滤软删除记录;四、通过数据库视图隔离未删除数据。

php增删改查怎么实现软删除_php软删除代码【设计】

如果在PHP应用中需要保留数据记录但又不希望其在业务逻辑中被显示或使用,则可以通过软删除机制实现。软删除通常不真正从数据库中移除记录,而是通过标记字段(如is_deleted、deleted_at等)来标识该记录已被逻辑删除。以下是实现PHP软删除的多种方法:

一、使用deleted_at时间戳字段配合Eloquent ORM

Laravel框架的Eloquent ORM原生支持软删除,通过在模型中引入SoftDeletes Trait,并在数据库表中添加deleted_at字段,即可自动拦截delete操作并写入删除时间。

1、在数据库迁移文件中为数据表添加deleted_at字段:
使用Schema::table()添加nullable的timestamp类型字段,字段名为deleted_at。

2、在对应的Eloquent模型类中引入SoftDeletes Trait:
在类声明下方添加use Illuminate\Database\Eloquent\SoftDeletes;并在class定义中加入use SoftDeletes;

立即学习“PHP免费学习笔记(深入)”;

3、执行删除操作时调用模型实例的delete()方法:
此时Eloquent不会执行DELETE SQL,而是执行UPDATE语句将deleted_at设为当前时间戳。

4、查询时默认自动排除已软删除的记录:
除非显式调用withTrashed()或onlyTrashed(),否则all()、find()等方法均不返回deleted_at非NULL的行。

5、恢复软删除记录可调用restore()方法:
该方法将deleted_at字段重置为NULL,使记录重新进入正常查询范围。

二、手动维护is_deleted布尔字段

在不依赖ORM软删除特性的场景下,可自行设计is_deleted(TINYINT(1)或BOOLEAN)字段,通过显式条件控制数据可见性与操作行为,适用于原生PDO、MySQLi或自定义DAO层。

1、在目标数据表中新增is_deleted字段:
字段类型设为TINYINT(1),默认值为0,表示未删除。

2、所有SELECT语句WHERE子句中追加AND is_deleted = 0条件:
必须确保每个业务查询都包含此过滤条件,否则会暴露已删除数据。

3、执行删除操作时改用UPDATE语句:
将对应记录的is_deleted值更新为1,而非使用DELETE语句。

4、在DAO方法中封装delete逻辑:
例如编写deleteById($id)方法,内部执行UPDATE table_name SET is_deleted = 1 WHERE id = ? AND is_deleted = 0。

laravel-specialist
laravel-specialist

精通 Laravel 10+,遵循现代 PHP 实践的 Laravel 专家。擅长优雅语法、Eloquent ORM、队列系统及企业级特性...

下载

5、提供restoreById($id)方法用于恢复:
执行UPDATE table_name SET is_deleted = 0 WHERE id = ? AND is_deleted = 1。

三、使用作用域(Scope)统一处理软删除状态

在支持查询构建器的框架(如Laravel)中,可通过本地作用域或全局作用域强制注入软删除过滤条件,避免在每个查询中重复书写WHERE子句,降低遗漏风险。

1、在模型中定义本地作用域scopeNotDeleted():
在方法内调用$where('is_deleted', 0)或$whereNull('deleted_at'),视字段类型而定。

2、在业务代码中使用该作用域替代原始查询:
例如User::notDeleted()->get()或User::notDeleted()->where('status', 1)->first()。

3、定义全局作用域并在boot()方法中注册:
创建一个实现Illuminate\Database\Eloquent\Scope接口的类,在apply()中添加统一的软删除条件。

4、启用全局作用域后,所有对该模型的查询自动附加软删除过滤:
需注意:withTrashed()和onlyTrashed()可临时绕过全局作用域。

5、对关联查询也应考虑作用域继承:
在定义belongsTo/hasMany关系时,可在关系方法中链式调用->withoutGlobalScopes()或显式添加where条件。

四、数据库视图隔离软删除数据

通过MySQL视图抽象出仅包含未删除记录的结果集,使上层应用无需感知软删除字段的存在,所有CRUD操作面向视图进行,由数据库层完成过滤与转换。

1、为原始表创建VIEW,名称如table_name_active:
SQL语句为CREATE VIEW table_name_active AS SELECT * FROM table_name WHERE is_deleted = 0;

2、应用程序中所有读取操作均针对该视图而非基表:
例如SELECT * FROM table_name_active WHERE status = 'published';

3、INSERT操作仍指向原始表:
因为视图通常不可直接插入,需保持基表写入路径不变。

4、UPDATE操作需区分是否涉及软删除字段:
若仅更新业务字段,可继续操作基表;若需“删除”,则UPDATE基表的is_deleted字段。

5、为保障一致性,应在基表上设置BEFORE UPDATE触发器:
当尝试将is_deleted由1改为0时,检查是否存在同名唯一约束冲突或其他业务限制。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

857

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

855

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2508

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4401

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

6390

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

4216

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

7909

2025.08.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

1496

2026.03.04

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 191人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn