razisayyed / laravel-cascaded-soft-deletes
级联删除/恢复软删除关系
v1.0.4
2024-02-27 18:33 UTC
Requires
- php: ^7.3|^8.1
- illuminate/support: ^9.0|^10.0
Requires (Dev)
- laravel/pint: ^1.14
- nunomaduro/collision: ^6.1|^7.0
- orchestra/testbench: ^7.0|^8.0
- phpunit/phpunit: ^9.3.3|^9.6
README
这是一个用于级联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
是一个使用 NodeTrait
从 laravel-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
特此授予任何获得本软件及其相关文档文件(“软件”)副本的人,无条件和免费地使用该软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向软件提供者提供软件的人这样做,但受以下条件约束
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
本软件按“现状”提供,不提供任何形式的保证,无论是明示的、默示的,还是包括但不限于适销性、适用于特定用途和不受侵犯的保证。在任何情况下,作者或版权所有者都不应对任何索赔、损害或其他责任负责,无论是基于合同行为、侵权行为还是其他行为,这些行为源于、产生于或与软件的使用或其他交易有关。