iatstut/laravel-cascade-soft-delete

用于实现软删除的Eloquent模型的级联删除

dev-master 2018-05-12 12:56 UTC

This package is not auto-updated.

Last update: 2024-09-23 07:31:50 UTC


README

v1.4.0

Travis Build Status Scrutinizer Code Quality Code Coverage Latest Stable Version Total Downloads License

简介

在删除父记录(例如,一个博客文章)的情况下,您可能希望同时删除与其关联的任何评论,以实现数据自我维护。

通常,您会使用数据库的外键约束,在评论表的外键约束中添加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请求。

如果您在使用此包,我很乐意听听您的想法。谢谢!