iatstuti/laravel-cascade-soft-deletes

此包已被废弃,不再维护。作者建议使用 dyrynda/laravel-cascade-soft-deletes 包。

Eloquent 模型软删除的级联删除

4.4.0 2024-03-18 23:17 UTC

This package is auto-updated.

Last update: 2024-03-18 23:18:28 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 存储库并提交一个拉取请求。

如果您正在使用此包,我非常想听听您的想法。谢谢!

Treeware

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

众所周知,应对气候危机并防止气温上升超过1.5C的最好工具之一是植树。如果您支持此包并为 Treeware 森林做出贡献,您将为当地家庭创造就业机会并恢复野生动物栖息地。

您可以在 这里 购买树木

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