pellesam / laravel-cascade-软删除与恢复
为实现了软删除的Eloquent模型提供级联删除和恢复功能
Requires
- php: ^7.3|^8.0
- illuminate/database: ^8.12|^9.0
- illuminate/events: ^8.12|^9.0
Requires (Dev)
- phpunit/phpunit: ^9.3
README
简介
在删除父记录的场景中,例如删除一篇博客文章,你可能还希望删除与之关联的任何评论,以维护你的数据。
通常,你会使用数据库的外键约束,在评论表的外键约束中添加ON DELETE CASCADE规则。
有时,你可能需要在删除父记录后恢复它。在这些情况下,你可能需要使用Laravel的软删除功能。
然而,这样做会失去使用数据库提供的级联删除功能的能力。这正是这个包旨在填补SoftDeletes特质功能空缺的地方。
代码示例
<?php namespace App; use App\Comment; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Post extends Model { use SoftDeletes, CascadeSoftDeleteAndRestore; protected $cascadeRelations = ['comments']; protected $dates = ['deleted_at']; public function comments() { return $this->hasMany(Comment::class); } }
现在你可以删除一个App\Post记录,任何相关的App\Comment记录也会被删除。如果App\Comment记录也实现了CascadeSoftDeleteAndRestore特质,它的子记录也会被删除,以此类推。
$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。
额外注意:如果你已经为将要级联软删除的模型设置了事件监听器,你可以调整事件的优先级或触发顺序,以便在级联软删除触发之后执行。为此,你可以将删除事件监听器的优先级设置为1。
MODEL::observe(MODELObserver::class, 1); 第二个参数是优先级。
MODEL::deleting(MODELObserver::class, 1);
截至目前,这尚未在Laravel文档中记录,但请记住,所有监听器的默认优先级为0,其中0是最低优先级。将大于0的参数传递给你的监听器将导致你的监听器在默认优先级为0的监听器之前触发。
安装
这个特质通过Composer安装。要安装,只需将其添加到你的composer.json文件中。
$ composer require pellesam/laravel-cascade-soft-delete-and-restore