dyrynda/laravel-cascade-soft-deletes

支持软删除的 Eloquent 模型的级联删除

4.4.0 2024-03-18 23:17 UTC

This package is auto-updated.

Last update: 2024-09-19 00:33:35 UTC


README

Build Status Latest Stable Version Total Downloads License Buy us a tree

简介

在删除父记录的场景中,例如删除一篇博客文章,您可能希望同时删除与之关联的任何评论,以实现数据自我维护。

通常,您会使用数据库的外键约束,在评论表的外键约束中添加 ON DELETE CASCADE 规则。

在父记录被删除后能够恢复父记录可能很有用。在这些情况下,您可能会使用 Laravel 的 软删除 功能。

然而,这样做会失去使用数据库提供的级联删除功能的能力。这就是此包旨在弥合使用 SoftDeletes 特性时功能差距的地方。

代码示例

<?php

namespace App;

use App\Comment;
use Dyrynda\Database\Support\CascadeSoftDeletes;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes, CascadeSoftDeletes;

    protected $cascadeDeletes = ['comments'];

    protected $dates = ['deleted_at'];

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

现在您可以删除 App\Post 记录,任何相关的 App\Comment 记录也将被删除。如果 App\Comment 记录也实现了 CascadeSoftDeletes 特性,其子记录也将被删除,依此类推。

$post = App\Post::find($postId)
$post->delete(); // Soft delete the post, which will also trigger the delete() method on any comments and their children.

注意:重要的是要知道,在级联软删除子记录时,无法知道哪些是通过级联操作删除的,哪些是在之前删除的。这意味着当您恢复博客文章时,相关的评论不会恢复。

因为该特性通过 deleting Eloquent 模型事件进行挂钩,所以如果触发任何异常,我们可以防止删除父记录以及任何子记录(如果有的话)。如果模型没有使用 Illuminate\Database\Eloquent\SoftDeletes 特性,或者定义的任何 cascadeDeletes 关系不存在,或者不返回 Illuminate\Database\Eloquent\Relations\Relation 实例,则会触发 LogicException

安装

此特性通过 Composer 安装。要安装,只需将其添加到您的 composer.json 文件中。

$ composer require dyrynda/laravel-cascade-soft-deletes

支持

如果您对此包有任何一般性问题,请随时在 Twitter 上联系我。

如果您认为您发现了问题,请使用 GitHub 问题跟踪器 报告它,或者更好的是,fork 存储库并提交一个 pull request。

如果您在使用此包,我很乐意听听您的想法。谢谢!

Treeware

您可以免费使用此包,但如果它进入您的生产环境,您需要为世界买一棵树。

现在众所周知,解决气候危机并防止我们的温度升高超过 1.5C 的最佳工具之一是种树。如果您支持此包并向 Treeware 森林做出贡献,您将为当地家庭创造就业机会并恢复野生动物栖息地。

您可以在 这里 买树。

关于 Treeware 的更多信息请访问 treeware.earth