iatstuti / laravel-cascade-soft-deletes
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 存储库并提交一个拉取请求。
如果您正在使用此包,我非常想听听您的想法。谢谢!
Treeware
您可以免费使用此包,但如果它进入您的生产环境,您需要为世界买一棵树。
众所周知,应对气候危机并防止气温上升超过1.5C的最好工具之一是植树。如果您支持此包并为 Treeware 森林做出贡献,您将为当地家庭创造就业机会并恢复野生动物栖息地。
您可以在 这里 购买树木
了解关于Treeware的更多信息,请访问treeware.earth