iatstut / laravel-cascade-soft-delete
用于实现软删除的Eloquent模型的级联删除
Requires
- php: >=5.4
- illuminate/database: ~5.0
- illuminate/events: ~5.0
Requires (Dev)
- phpunit/phpunit: ^4.8
This package is not auto-updated.
Last update: 2024-09-23 07:31:50 UTC
README
v1.4.0
简介
在删除父记录(例如,一个博客文章)的情况下,您可能希望同时删除与其关联的任何评论,以实现数据自我维护。
通常,您会使用数据库的外键约束,在评论表的外键约束中添加ON DELETE CASCADE
规则。
在删除父记录后,可能需要恢复父记录。在这些情况下,您可能需要使用Laravel的软删除
功能。
然而,这样做会失去使用数据库提供的级联删除功能的能力。这正是此包旨在弥合使用SoftDeletes
特性时功能差距的地方。
从v1.0.2
版本开始,您可以从基础模型类继承CascadeSoftDeletes
,如果所有模型都实现了SoftDeletes
,则无需在每个子模型上使用特性。
从v1.0.4
版本开始,该包支持孙子记录的级联删除(#8,#9)。
从v1.0.5
版本开始,该包对hasOne
关系提供了更好的支持(#10,#11)。
v1.1.0
增加了与Laravel 5.3的兼容性。
v1.2.0
增加了与Laravel 5.4的兼容性。
v1.3.0
增加了与Laravel 5.5的兼容性。
v1.4.0
增加了与Laravel 5.6的兼容性。
代码示例
<?php namespace App; use App\Comment; use Iatstuti\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.
注意:重要的是要知道,在级联软删除子记录时,无法知道哪些是通过级联操作删除的,哪些是在之前删除的。这意味着当您恢复博客文章时,相关的评论不会恢复。
因为此特性通过Eloquent模型的deleting
事件钩子,我们可以在引发任何异常时阻止删除父记录以及任何子记录。如果模型没有使用Illuminate\Database\Eloquent\SoftDeletes
特性,或者定义的任何cascadeDeletes
关系不存在,或者不返回Illuminate\Database\Eloquent\Relations\Relation
的实例,将引发LogicException
。
附加说明:如果您已经为将要级联软删除的模型设置了现有的事件监听器,您可以调整事件的优先级或触发顺序,以便让CascadeSoftDeletes在您的事件之后触发。为此,您可以设置删除事件监听器的优先级为1。
MODEL::observe( MODELObserver::class, 1 );
第二个参数是优先级。
MODEL::deleting( MODELObserver::class, 1 );
截至目前,这尚未在Laravel文档中记录,但请知道所有监听器的默认优先级是0
,而0
是最低优先级。将大于0
的参数传递给您的监听器将导致您的监听器在默认优先级为0
的监听器之前触发。
安装
此特性通过Composer安装。要安装,只需将其添加到您的composer.json
文件中。
$ composer require iatstuti/laravel-cascade-soft-deletes
支持
如果您在使用此包时遇到一般性问题,请随时在Twitter上联系我。
如果您认为您发现了问题,请使用GitHub问题跟踪器报告它,或者更好的是,fork存储库并提交一个pull请求。
如果您在使用此包,我很乐意听听您的想法。谢谢!