3分钟短文:Laravel说要用软删除,可不要真删
引言
我们不止一次在系列文章中讲到模型的“软删除”功能,因为现实场景中为了保证数据可追溯,我们几乎不会对数据库进行物理删除。删除数据有可能会造成数据一致性的破坏,进而导致业务逻辑无法跑通。所以,软删除的概念,极为重要。
本文我们仍然不厌其烦地讲解软删除的功能。
物理删除
其实就是真实地把数据从数据库条目清除,laravel模型提供了开箱即用的方法。比如下面这样使用:
$event = Event::find(12);
$event->delete();
首先使用primary key查询出需要的条目,返回一个Event对象实例,然后调用 delete 方法进行删除。真实的SQL如下:
DELETE FROM events WHERE id = 12;
laravel提供了许多语法糖,上面使用 find 和 delete 两个步骤,可以缩减为一个方法 destroy,用法如下:
Event::destroy(12);
这样一行就搞定了。
软删除
在许多情况下,你不会真正想要从数据库中删除记录,而是用一种不再在应用程序中显示它们的方式对其进行注释。这就是所谓的软删除。
Laravel本身支持软删除,只需要进行少量的配置更改,以确保在执行delete或destroy时,模型的记录不会被实际删除。作为一个例子,我们修改Event模型以支持软删除。
首先创建一个新的迁移,将名为deleted_at的列添加到events表中:
php artisan make:migration add_soft_delete_to_events --table=events
执行成功,输出内容如下:
Created Migration: 2020_10_08_184402_add_soft_delete_to_events
接着在生成的迁移文件内实现迁移使用的 up 方法:
public function up()
{
Schema::table('events', function(Blueprint $table)
{
$table->softDeletes();
});
}
还有用于迁移回滚的 down 方法:
public function down()
{
Schema::table('events', function(Blueprint $table)
{
$table->dropColumn('deleted_at');
});
}
修改完毕,在命令行执行迁移指令:
php artisan migrate
执行成功输出内容:
Migrating: 2020_10_08_184402_add_soft_delete_to_events
Migrated: 2020_10_08_184402_add_soft_delete_to_events
模型SoftDelete
有了数据库表的支持,我们才能在模型内使用软删除的功能。
其实原理很简单,就是为模型追加一个全局作用域,为每个查询子句追加上如下筛选条件:
WHERE deleted_at IS NULL
laravel已经为我们写好这部分逻辑了,在模型内引入如下trait:
namespace App;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;
在类内引入trait,并手动指定修改器,也就是说deleted_at字段,我们使用 Carbon 进行实例化操作。
class Event extends Model {
use SoftDeletes;
protected $dates = ['created_at','deleted_at','started_at','updated_at'];
}
保存这些更改之后,下次删除与此模型关联的记录时,deleted_at列将被设置为当前时间。任何设置deleted_at为日期时间值的记录,都不会包含在任何查询结果中,因此看起来已经被删除了。
这样操作非常有用,因为误删除的数据,随时可以通过设置 deleted_at = null 而恢复到正常的业务流程中,比如删除的用户,删除的订单,等等其他资源。
如果你在代码内要坚持查询全量数据,也包含软删除了的数据,那么代码这样写:
$events = Event::withTrashed()->get();
写在最后
本文我们有重温了laravel的模型软删除功能,通过创建迁移文件,修改数据库表,追加软删除字段。并在模型内引入 SoftDelete 代码片段引入软删除的程序功能。
Happy coding :-)
- Docker系列教程13-Docker可视化管理工具
- Ubuntu 16.04 安装VNC
- 使用Feign实现Form表单提交
- Ubuntu 16.04 Install OpenCV
- Spring Cloud各组件调优参数
- 手把手教你设置 IntelliJ IDEA 的彩色代码主题
- 实用技巧:Hystrix传播ThreadLocal对象(两种方案)
- OpenDaylight与Mininet应用实战之流表操作
- 使用Spring Cloud Feign上传文件
- 用 TensorFlow 让你的机器人唱首原创给你听
- Spring Cloud限流详解(附源码)
- 手动安装Docker 17.06
- 详述使用 IntelliJ IDEA 解决 jar 包冲突的问题
- Spring Cloud各组件重试总结
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- python中使用scikit-learn和pandas决策树进行iris鸢尾花数据分类建模和交叉验证
- CNN+ Auto-Encoder 实现无监督Sentence Embedding ( 基于Tensorflow)
- R语言数据可视化分析案例:探索BRFSS数据
- R语言探索BRFSS数据可视化
- 基于ThinkPhp6.0+Vue 开发的一套免费开源新零售商城系统
- Kubernetes之RBAC权限管理
- 这是一份 pip 常用命令小结~
- 聊聊claudb的Database
- WebSocket 初识篇
- (一)MessageQueue之消息入队
- 宇智波程序笔记2-kafka 生产发送消息失败无响应,
- 高并发系统三大利器之缓存
- Nuxt.js框架(SSR)学习笔记
- 也谈状态模式
- BFE.dev前端刷题1 - 实现curry()