Laravel 软删除模型指南

应用程序中用户犯错并意外删除数据是很常见的,即使在他们删除数据之前向他们显示了数次警告。此时需要引入数据恢复的功能,以便于在删除后恢复,并在一定时间后永久删除该数据。

软删除

如果希望在用户删除其账户后保留一段时间,以便于恢复它。需要创建一个新的迁移文件向 User 模型添加软删除。

/**
* Run the migrations.
*
* @return void
*/
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->softDeletes();
    });
}
添加 traitSoftDeletes
class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable, SoftDeletes;
    // ...
}

到此,软删除已经正常工作了。当用户删除账户时,应用程序不会直接删除该记录,而只是设置删除时间。
永久删除用户和恢复用户的方法参考软删除文档

定时清理数据

如果想要定期清理数据库并自动删除软删除模型,这称为 修剪。与在 Laravel 中向模型添加软删除类似,可以使用 Prunable 特性和在模型中实现 prunable 方法,该方法告诉 Laravel 何时删除软删除模型。

添加 traitPrunable
class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable, SoftDeletes, Prunable;
    // ...
}

这个 trait 告诉 Laravel,当调度程序运行时,它应该在这个模型中寻找 prunable 方法

一个好的做法是一周后删除用户,这样即使您的支持队列已满,您也可以选择恢复它们,同时也给他们一个合理的时间,知道他们的数据从系统中擦除。

添加 prunable 方法
public function prunable()
{
  return static::where('deleted_at', '<=', now()->subWeek());
}

设置完成后,可以通过将命令添加到控制台内核来安排命令每天修剪模型:

$schedule->command('model:prune')->daily();
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

谢谢分享,get 新知识点 Prunable

3年前 评论

学习了。优雅,脏数据都安排得明明白白。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!