第一句子大全,网罗天下好句子,好文章尽在本站!

3分钟短文:Laravel说要用软删除 可不要真删

时间:2015-08-31

删除数据有可能会造成数据一致性的破坏,进而导致业务逻辑无法跑通

友情提示:本文共有 1929 个字,阅读大概需要 4 分钟。

引言

我们不止一次在系列文章中讲到模型的“软删除”功能,因为现实场景中为了保证数据可追溯,我们几乎不会对数据库进行物理删除。删除数据有可能会造成数据一致性的破坏,进而导致业务逻辑无法跑通。所以,软删除的概念,极为重要。

本文我们仍然不厌其烦地讲解软删除的功能。

物理删除

其实就是真实地把数据从数据库条目清除,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 :-)

我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者

本文如果对你有帮助,请点赞收藏《3分钟短文:Laravel说要用软删除 可不要真删》,同时在此感谢原作者。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
3分钟短文|Laravel 获取模型查询生成的SQL语句

3分钟短文|Laravel 获取模型查询生成的SQL语句

引言在程序开发阶段,我们关注于业务逻辑,实现功能。而laravel提供了非常好的 debug 支持,只需在 env 文件内指定 debug = true ,就可以在页面打开 debug bar 用于调试。其中也包含有Query选项,列出了程序加载流程中所有调用的SQL...

2023-05-13 #经典句子

掌握这几招 迅速提高英语考试中的短文改错分!千万别再错过~

掌握这几招 迅速提高英语考试中的短文改错分!千万别再错过~

...方向。应该是个高中生吧~对于高中生来说,语法填空、短文改错这是必抓的项的,今天我们就短文改错的方法一起来个讨论。这是2018年英语高考全国卷的短文改错题,很多学生想必非常熟悉。我们先来说说做题的顺序。一、做...

2023-10-14 #经典句子

解析2020高考英语II短文改错真题 助力英语学习

解析2020高考英语II短文改错真题 助力英语学习

真题呈现假定英语课上老师要求同桌之间交换修改作文,请你修改你同桌写的以下作文文中共有10处语言错误,每句中最多有两处。每处错误仅涉及一个单词的增加、删除或修改。增加: 在缺词处加一个漏字符(∧),并在其下面...

2022-12-10 #经典句子

高考英语 短文改错 秘诀大汇总

高考英语 短文改错 秘诀大汇总

高考英语短文改错秘诀大汇总为了提高做短文改错题的能力,除了要加强基础知识的积累、提高语篇的整体理解能力之外,还应该对其错项设置的基本情况有所了解,以便做到目标明确,有的放矢,从而提高解题的正确率。本文...

2022-11-14 #经典句子

写作的黄金法则:如何把你的文章写出王家卫风格

写作的黄金法则:如何把你的文章写出王家卫风格

...卫,那么建议你看看接下来的3条关于写作的建议。01从好短文中获取灵感请看插画家卢·比奇(Lou Beach)在社交网络上写的这段状态更新:我从未看见有人住在街对面那个油漆剥落、楼梯破损的房子里。 阴影总是遮蔽着它,邮差...

2023-07-10 #经典句子

在最后关键时期 如何使你在高考时英语成绩更高?这些建议很暖心

在最后关键时期 如何使你在高考时英语成绩更高?这些建议很暖心

...however、but,因果关系处。)1、 细节题:先读题,然后去短文中仔细找答案,切忌不要根据自己认知习惯做题去短文中找出答案画出来,避免被错误选项(扩大缩小范围、偷换词语等)干扰;2、 词汇、短语题:这类题你要回到...

2023-07-20 #经典句子

高考英语短文改错答题的七大技巧详解!不容错过哦

高考英语短文改错答题的七大技巧详解!不容错过哦

短文改错对考生的要求较高,是对语言知识综合运用能力的考查,检测考生发现、判断、纠正文章错误的能力,进而考查学生的词法、句法及行文逻辑等方面的水平。考生在该项上往往失分较多,对该题感到束手无策。那么怎样...

2022-11-20 #经典句子

高考英语短文改错公式

高考英语短文改错公式

...】经微信公众号授权转载,如需转载与原文作者联系一、短文改错万能公式1.谓语动词的错误是历年考试的重点和热点,常见动词错误类型有:①一般现在时与一般过去时错用;②and前后动词时态不一致;③主谓不一致;④缺少动词,...

2022-11-14 #经典句子