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

is_del 字段就完事?加一个 is_del 字段只是软删除的起点,不是终点。直接在所有查询里手动加 WHERE is_del = 0 极易遗漏,尤其在关联查询、统计、分页或第三方库调用时。一旦漏写,用户就能看到“已删除”数据,或者误删未标记的数据。
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 的典型场景
"SELECT * FROM user WHERE id = {$id}" 完全没判断 is_del
SELECT COUNT(*) FROM user 得到的是总行数,不是有效用户数is_del 状态:缓存了含已删除数据的结果,后续请求一直读脏数据已有线上数据,is_del 字段默认值是 NULL 或 1,会导致历史数据全被当成“已删除”。必须在加字段后立刻执行初始化:
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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。