ogestor / laravel-soft-cascade
Laravel Cascade Soft Delete & Restore
Requires
- php: ^7.2
- illuminate/container: ^6.0
- illuminate/database: ^6.0
- illuminate/events: ^6.0
- illuminate/support: ^6.0
Requires (Dev)
- codacy/coverage: dev-master
- orchestra/testbench: ~4.0
- phpunit/phpunit: ~8.0
This package is auto-updated.
Last update: 2024-09-13 23:44:18 UTC
README
Laravel/Lumen Soft Cascade Delete & Restore
使用 Laravel 或 Lumen SoftDeletes 功能时,实现级联删除和恢复。
我为什么需要它?
为了使软删除和恢复关系变得简单。
如果你喜欢 MySQL 级联删除等特性,但想使用 Laravel 的 SoftDeletes 功能,你需要进行一些额外步骤以确保你的关系被正确删除或恢复。
此软件包旨在用一个简单的定义你想要级联关系的数组来替换这些步骤。
安装
使用 composer 安装
composer require askedio/laravel-soft-cascade
从 Laravel 5.5 开始,可以充分利用服务提供者的自动发现功能。对于 5.5 之前的 Laravel 版本,您必须在 config/app.php 中注册服务提供者。
Askedio\SoftCascade\Providers\GenericServiceProvider::class,
Lumen 不支持自动发现功能,您应手动添加提供者。
Askedio\SoftCascade\Providers\LumenServiceProvider::class,
用法
在你的 Model
中启用特性并定义 $softCascade
。 示例。
use \Askedio\SoftCascade\Traits\SoftCascadeTrait;
protected $softCascade = ['profiles'];
对于受限关系使用。 示例。
use \Askedio\SoftCascade\Traits\SoftCascadeTrait;
protected $softCascade = ['addresses@restrict'];
$softCascade
是一个包含你的关系名称的数组,在 示例 中,你可以看到我们为该关系定义了 function profiles()
。
嵌套关系通过在相关的 Model
中定义 $softCascade
来工作,如 此处 所示。
在定义了你的关系后,你可以在你的 Model
上简单地触发 delete()
或 restore()
,你的关系将执行相同的任务。
User::first()->delete();
User::withTrashed()->first()->restore();
它也可以用这种方式与查询构建器一起使用,因为查询构建器监听器在查询之后执行,由于受限关系,我们需要在出错时使用事务来回滚查询。
try {
DB::beginTransaction(); //Start db transaction for rollback query when error
User::limit(2)->delete();
User::withTrashed()->limit(2)->restore();
DB::commit(); //Commit the query
} catch (\Exception $e) {
DB::rollBack(); //Rollback the query
//Optional, if we need to continue execution only rollback transaction and save message on variable
throw new \Askedio\SoftCascade\Exceptions\SoftCascadeLogicException($e->getMessage());
}
支持的 PHP 版本
- >=7.1.13
支持的数据库
- MySQL
- PostgreSQL
- SQLite
- SQL Server
测试
我写了一些非常基本的测试,当然这里还需要做更多。如果你觉得这个有用,请通过测试其他数据库或编写更好的单元测试来帮助,因为我必须继续前进。
问题 & 贡献
我将使用 MySQL 在一个新的 API 中使用它,所以任何与我的使用相关的任何问题都将得到解决。如果你发现 MySQL 有问题,请报告它,我会修复它。
如果你使用的是其他数据库并存在问题,请通过提交拉取请求来贡献。我没有时间测试其他数据库,但假设所有都应该可以工作。