razisayyed/laravel-cascaded-soft-deletes

级联删除/恢复软删除关系

v1.0.4 2024-02-27 18:33 UTC

This package is auto-updated.

Last update: 2024-09-27 20:30:45 UTC


README

Tests codecov Total Downloads Latest Stable Version Latest Unstable Version Scrutinizer Code Quality License

这是一个用于级联SoftDeletes删除/恢复操作的Laravel 8包。

  • Laravel 7.0 从v0.1.0到v1.0.2支持
  • Laravel 8.0 从v0.1.0到v1.0.2支持
  • Laravel 9.0 自v1.0.2起支持
  • Laravel 10.0 自v1.0.4起支持(感谢 @mojowill

尽管这个项目完全免费使用,但我非常感谢任何支持!

内容

功能

  • 为选定的关系级联软删除
  • 为选定的关系级联恢复(只有当deleted_at >= restoredInstance->deleted_at值时,相关模型才会被恢复)
  • 能够跟踪 自定义查询
  • 默认情况下,所有级联操作都将添加到默认队列中,您可以通过 发布包的配置文件 来更改此行为。

注意

  • 这个包的想法是从令人惊叹的包 laravel-nestedset 中提取出来的
  • 因为该包依赖于deleted_at列在级联恢复动作时进行比较,所以建议在迁移文件中使用 $table->softDeletes('deleted_at', 6);。否则,您可能会在几秒钟内恢复一个在实例之前被删除的相关模型。

安装

要安装该包,在终端

composer require razisayyed/laravel-cascaded-soft-deletes

发布配置

如果您需要更改sync/async行为的配置值,可以发出

php artisan vendor:publish --provider="RaziAlsayyed\LaravelCascadedSoftDeletes\Providers\CascadedSoftDeletesProvider" --tag="config"

设置

要设置CascadedSoftDeletes,您需要在父模型中使用特性并定义 $cascadedSoftDeletes 属性或实现 getCascadedSoftDeletes() 方法。

带有$cascadedSoftDeletes属性的简单示例

...
<?php

use \Illuminate\Database\Eloquent\Model;
use \Illuminate\Database\Eloquent\SoftDeletes;
use RaziAlsayyed\LaravelCascadedSoftDeletes\Traits\CascadedSoftDeletes;

class Page extends Model {

    use SoftDeletes;
    use CascadedSoftDeletes;

    protected $cascadedSoftDeletes = [ 'blocks' ];

    public function blocks()
    {
        return $this->hasMany(Block::class);
    }

}
<?php

use \Illuminate\Database\Eloquent\Model;
use \Illuminate\Database\Eloquent\SoftDeletes;

class Block extends Model {

    use SoftDeletes;

    public function page() 
    {
        return $this->belongsTo(Page::class);
    }

}

带有getCascadedSoftDeletes和自定义查询的高级示例

您还可以定义一个自定义查询来级联软删除和恢复。

以下示例描述了一个场景,其中 Folder 是一个使用 NodeTraitlaravel-nestedset 类的模型,并且每个文件夹都有多个相册。getCascadedSoftDeletes() 中的示例将级联软删除和恢复到与文件夹及其所有后代相关的相册。

...
<?php

use \Illuminate\Database\Eloquent\Model;
use \Illuminate\Database\Eloquent\SoftDeletes;
use RaziAlsayyed\LaravelCascadedSoftDeletes\Traits\CascadedSoftDeletes;

class Folder extends Model {

    use SoftDeletes;
    use NodeTrait;
    use CascadedSoftDeletes;

    public function albums()
    {
        return $this->hasMany(Album::class);
    }

    protected function getCascadedSoftDeletes()
    {
        return [
            'albums' => function() {
                return Album::whereHas('folder', function($q) {
                    $q->withTrashed()
                        ->where('_lft', '>=', $this->getLft())
                        ->where('_rgt', '<=', $this->getRgt());
                });  
            }
        ];
    }

}

父模型和子模型类的需求

  • 两个类都必须使用SoftDeletes特性。
  • 父类必须使用CascadedSoftDeletes特性。
  • 父类必须定义 $cascadedSoftDeletes 或实现 getCascadedSoftDeletes 方法,该方法必须返回一个级联HasMany关系列表和/或自定义查询。

许可证

MIT许可证

版权所有 (c) 2022 Razi Alsayyed

特此授予任何获得本软件及其相关文档文件(“软件”)副本的人,无条件和免费地使用该软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向软件提供者提供软件的人这样做,但受以下条件约束

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

本软件按“现状”提供,不提供任何形式的保证,无论是明示的、默示的,还是包括但不限于适销性、适用于特定用途和不受侵犯的保证。在任何情况下,作者或版权所有者都不应对任何索赔、损害或其他责任负责,无论是基于合同行为、侵权行为还是其他行为,这些行为源于、产生于或与软件的使用或其他交易有关。