美文网首页
3分钟短文:Laravel说要用软删除,可不要真删

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

作者: 程序员小助手 | 来源:发表于2020-10-22 21:30 被阅读0次

引言

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

img

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

物理删除

其实就是真实地把数据从数据库条目清除,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 Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

在类内引入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说要用软删除,可不要真删

    引言 我们不止一次在系列文章中讲到模型的“软删除”功能,因为现实场景中为了保证数据可追溯,我们几乎不会对数据库进行...

  • linux删除软连接

    rm -rf folder ##删除软连接 rm -rf ./folder ##删除源文件夹 千万不要用“./”,...

  • Laravel软删除

    1.首先要做一些设置首先在模型类中要使用SoftDeletestrait,该trait为软删除提供一系列相关方法,...

  • laravel中使用软删除

    在模型层中(Models)添加三行代码搞定 use Illuminate\Database\Eloquent\So...

  • Laravel 数据删除以及软删除

    所谓软删除指的是数据表记录并未真的从数据库删除,而是将表记录的标识状态标记为软删除,这样在查询的时候就可以加以过滤...

  • 用力爱过的人 就别删了

    分手后,到底要不要互删好友? 很多人都说:“删吧,不删的话你会忍不住找他。” 但也有人说:“就算删除,也删不掉他带...

  • Mac下手动卸载软件可以关注的目录

    确定待删软件已经完全退出  --> 关于本机 --> 存储空间 --> 管理 --> 应用程序 --> 待删除软...

  • ubuntu彻底删除通过apt方式安装的程序

    以删除apache2为例,其它程序也都是这么删...1.先通过apt删除程序和相关配置文件 2.自动删除不使用的软...

  • 2019-08-07 mac命令行打开sublime

    mac下命令行打开sublime编辑器,需要用ln命令建立软连接: 删除软连接: 注意:/Applications...

  • Laravel6.X软删除教程

    软删除的意思就是没有真正删除,只是在数据库里标记了一下,便于随时恢复。我们可以软删除用户,让他失去正常的权限,也可...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/ojetmktx.html