php删除数据怎么软删除_添加is_del字段标记删除【技巧】


仅加 is_del 字段不能实现可靠软删除,因易遗漏过滤、破坏框架功能、引发数据一致性问题;须配合全局查询约束、字段初始化、索引优化及全链路改造。

PHP 软删除为什么不能只加 is_del 字段就完事?

加一个 is_del 字段只是软删除的起点,不是终点。直接在所有查询里手动加 WHERE is_del = 0 极易遗漏,尤其在关联查询、统计、分页或第三方库调用时。一旦漏写,用户就能看到“已删除”数据,或者误删未标记的数据。

怎么让 Laravel 的 Eloquent 自动过滤软删除记录?

Laravel 原生支持软删除,但必须用 SoftDeletes trait + deleted_at 字段,而不是自定义 is_del。强行用 is_del 会导致 delete() 不生效、restore() 报错、withTrashed() 失效——因为框架底层只识别 deleted_at

如果你必须用 is_del(比如 legacy 表结构不允许改字段),就得手动重写模型行为:

class User extends Model
{
    protected $casts = [
        'is_del' => 'boolean',
    ];
public function scopeActive($query)
{
    return $query->where('is_del', false);
}

public function delete()
{
    $this->is_del = true;
    return $this->save();
}

}

使用时必须显式调用:User::active()->find(123),否则 User::find(123) 仍会查出已“删除”的记录。

MySQL 查询中漏掉 is_del = 0 的典型场景

  • 原始 SQL 拼接:比如 "SELECT * FROM user WHERE id = {$id}" 完全没判断 is_del
  • JOIN 查询:左表加了条件,右表没加,导致“已删除用户”的订单仍被查出来
  • COUNT 统计:写 SELECT COUNT(*) FROM user 得到的是总行数,不是有效用户数
  • 缓存键未包含 is_del 状态:缓存了含已删除数据的结果,后续请求一直读脏数据

硬切换到软删除时最常踩的坑

已有线上数据,is_del 字段默认值是 NULL1,会导致历史数据全被当成“已删除”。必须在加字段后立刻执行初始化:

ALTER TABLE `user` ADD COLUMN `is_del` TINYINT(1) DEFAULT 0 NOT NULL;
UPDATE `user` SET `is_del` = 0 WHERE `is_del` IS NULL;

另外,所有索引都要重新评估——如果高频查询都带 is_del = 0,建议把 is_del 加进联合索引,例如:INDEX idx_status_id (is_del, id)。否则 MySQL 可能全表扫描过滤掉大量已删除记录。

真正麻烦的不是加字段,而是让所有读写路径都意识到这个字段的存在。哪怕 ORM 层封装好了,原生 SQL、定时任务、数据分析脚本、ES 同步逻辑,都得逐个对齐。


# mysql  # php  # laravel  # ai  # 为什么  # sql  # NULL  # count  # 封装  # select  # delete  # 数据分析  # 的是  # 如果你  # 好了  # 都要  # 就能  # 已有  # 意识到  # 线上  # 分页  # 自定义 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Windows10如何更改任务栏高度_Win10解除锁定调整大小  Win11怎么设置屏保时间_调整Win11屏幕保护等待时间【详解】  Win11如何设置系统语言_Win11系统语言切换教程【攻略】  Windows系统被恶意软件破坏后的恢复策略_错误提示修复方式  php订单日志怎么在swoole写_php协程swoole写订单日志教程【教程】  LINUX的SELinux是什么_详解LINUX强制访问控制系统的入门与配置  如何在 Go 中正确初始化结构体中的 map 字段  Win11视频默认播放器怎么改_Win11关联第三方播放器【步骤】  Win11怎么设置屏保_Windows 11屏幕保护程序开启与设置【详解】  Mac如何备份到iCloud_Mac桌面与文稿文件夹云同步【设置】  Python高性能计算项目教程_NumPyCythonGPU并行加速  如何在 Go 结构体中正确初始化 map 字段  Windows服务无法启动错误1067是什么_进程意外终止的解决方法  Win10如何更改电脑休眠时间_Windows10电源和睡眠选项调整  php中::能用于接口静态方法吗_接口静态方法调用规则【操作】  Go 中 defer 在 goroutine 内部不生效的原因与执行时机详解  Win11怎么关闭自动修复_跳过Win11开机自动修复循环【技巧】  VSC里PHP变量未定义报错怎么解决_错误抑制技巧【解答】  PHP怎么接收URL中的锚点参数_获取#后面参数值的技巧【详解】  Windows10系统更新错误0x80070002_Win10自动更新失败手动修复  Win10怎么限制单程序CPU占用上限_Win10任务管理器亲和性或第三方工具均衡负载【技巧】  c++ atoi和atof函数用法_c++字符数组转数字  如何使用正则表达式提取以编号开头、后跟多个注解的完整代码块  如何在Golang中定义接口_抽象方法和多态实现  Win11截图快捷键是什么_Win11自带截图工具使用技巧【汇总】  C++中的协变与逆变是什么?C++函数指针与返回类型详解【类型系统】  Win11怎么退出微软账户_切换Win11为本地账户登录方法【详解】  Win11如何设置开机自动联网 Win11宽带连接自动拨号【步骤】  如何在Golang中实现基础配置管理功能_Golang配置文件读取与更新示例  Windows10系统怎么查看显卡驱动_Win10设备管理器驱动更新  php订单日志怎么导出excel_php导出订单日志到表格教程【教程】  如何开启Windows的远程服务器管理工具(RSAT)?(管理服务器)  Win11怎么关闭SmartScreen_禁用Windows Defender筛选器教程【步骤】  如何外贸网站设计-能留住客户提升用户体验!  How to Properly Use NumPy in VS Code  Win11怎么关闭开机声音_Win11系统启动提示音静音【教程】  如何使用Golang操作指针变量_Golang解引用与赋值实践  Win11怎么设置默认浏览器Chrome_Windows11修改默认网页打开方式  PHP 中如何在函数内持久修改引用变量所指向的目标  如何在Golang中实现微服务负载均衡_Golang负载均衡策略与实现示例  Win11如何卸载OneDrive_Win11卸载OneDrive方法【教程】  VSC怎样在Linux运行PHP_Ubuntu系统配置步骤【操作】  Win11如何设置文件权限 Win11 NTFS文件夹所有权与安全设置【高级】  Windows11如何设置专注助手_Windows11专注助手使用攻略【技巧】  Golang如何遍历目录文件_Golang filepath.Walk目录遍历操作方法  php485函数执行慢怎么优化_php485性能提升小技巧【技巧】  Win11怎么设置默认终端应用_Windows11开发者选项终端  Win11任务栏怎么调到左边_Win11开始菜单居左设置教程【步骤】  Win11怎么退出高对比度模式_Win11取消反色显示快捷键【修复】  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言 

 2026-01-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.