dyrynda / laravel-cascade-soft-deletes
支持软删除的 Eloquent 模型的级联删除
Requires
- php: ^8.1
- illuminate/database: ^10.0 || ^11.0
- illuminate/events: ^10.0 || ^11.0
Requires (Dev)
- pestphp/pest: ^2.34
- pestphp/pest-plugin-drift: ^2.5
README
简介
在删除父记录的场景中,例如删除一篇博客文章,您可能希望同时删除与之关联的任何评论,以实现数据自我维护。
通常,您会使用数据库的外键约束,在评论表的外键约束中添加 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