pellesam/laravel-cascade-软删除与恢复

为实现了软删除的Eloquent模型提供级联删除和恢复功能

安装: 18

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 74

类型:实用工具

4.2.0 2022-01-26 03:50 UTC

This package is auto-updated.

Last update: 2024-09-23 22:01:33 UTC


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