laravel框架软删除

2019-03-05 00:52:22 舟亭 语言

    在日常开发过程中,删除数据库记录在所难免,但是我们多数时候并不想从数据库中物理删除记录,而只是想从业务角度逻辑删除。Eloquent 模型类为我们提供了「软删除」功能的支持

原理是在支持软删除的数据表中添加一个 deleted_at 字段,这可以通过数据库迁移来实现。比如我们想要让 posts 表支持软删除,需要为其创建一个数据库迁移:

php artisan make:migration alter_posts_add_deleted_at --table=posts

然后在新生成的迁移文件中编写代码如下:

softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->dropColumn('deleted_at');
        });
    }
}

这样,运行 php artisan migrate 命令即可在 posts 表中新增一个 deleted_at 字段。该字段默认值为 NULL,表示没有被软删除。如果要在模型类中支持软删除,需要在对应模型类(在本例中是 Post 模型)中添加支持软删除的 Trait:

这样我们在模型类上做所有常规查询操作的时候就会过滤掉被软删除的记录

要软删除一条记录,在对应模型类实例上调用 delete 方法即可,底层会自动将数据表的 deleted_at 字段设置为当前时间,表示该记录已经被「删除」。

要判断一条记录是否被软删除,可以通过 trashed 方法:

$post = Post::findOrFail(32);
$post->delete();
if ($post->trashed()) {
    dump('该记录已删除');
}

如果想要在查询结果中出现软删除记录,可以通过在查询的时候调用 withTrashed 方法实现:

$post = Post::withTrashed()->find(32);

如果只需要获取被软删除的记录,这可以通过 onlyTrashed 方法来实现:

$post = Post::onlyTrashed()->where('views', 0)->get();

如果是误删除的话,你可以 restore 方法来恢复软删除记录:

$post->restore();   // 恢复单条记录
Post::onlyTrashed()->where('views', 0)->restore(); // 恢复多条记录

最后,如果你确实是想物理删除数据表记录,通过 forceDelete 方法删除即可:

$post->forceDelete();



标签: php laravel

评论:

发表评论:

前方两条路,一条通往远方的田野,一条通往凌霄的山巅

Powered by zzchao

浙ICP备18023797号