assettv / laravel-cascaded-soft-deletes
Cascade soft delete for chosen relations
Requires
- php: ^8.4
- illuminate/contracts: ^11.0||^12.0
- illuminate/support: ^11.0||^12.0
- spatie/laravel-package-tools: ^1.16
Requires (Dev)
- larastan/larastan: ^2.9||^3.0
- laravel/pint: ^1.14
- nunomaduro/collision: ^8.1.1||^7.10.0
- orchestra/testbench: ^10.0.0||^9.0.0
- pestphp/pest: ^3.0
- pestphp/pest-plugin-laravel: ^3.0
- phpstan/extension-installer: ^1.3||^2.0
- phpstan/phpstan-deprecation-rules: ^1.1||^2.0
- phpstan/phpstan-phpunit: ^1.3||^2.0
- spatie/laravel-ray: ^1.35
This package is auto-updated.
Last update: 2025-06-16 10:10:15 UTC
README
Features
-
Cascade Soft Delete for Relations
Soft delete related records automatically when a parent is soft deleted. -
Cascade Restore for Relations
Automatically restore related models if theirdeleted_at
is later than or equal to the parent's restore date. -
Custom Query Support
Use a custom query to control cascade actions. -
Configurable Queue Behavior
All cascade actions are queued by default. This behavior can be customized by publishing and editing the package's config file.
Note:
This package is based on Laravel Cascaded Soft Deletes (original, no longer maintained).
Installation
You can install the package via composer:
composer require assettv/laravel-cascaded-soft-deletes
You can publish the config file with:
php artisan vendor:publish --tag="laravel-cascaded-soft-deletes-config"
Usage
To set up CascadedSoftDeletes, you need to use the trait on the parent model and define $cascadedSoftDeletes
property or getCascadedSoftDeletes()
method.
Simple example with $cascadedSoftDeletes
property
<?php use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use AssetTV\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); } }
Advanced example with getCascadedSoftDeletes
and custom queries
You can also define a custom query to cascade soft deletes and restores through.
The following example describes a scenario where Folder is a model that uses NodeTrait
from laravel-nestedset class and each folder has many albums. getCascadedSoftDeletes() in the example will cascade soft deletes and restores to albums related to the folder and all its descendants.
<?php use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use AssetTV\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()); }); } ]; } }
Requirements for the Parent & Child model classes
- Both classes must use SoftDeletes trait.
- Parent class must use CascadedSoftDeletes trait.
- Parent class must define
$cascadedSoftDeletes
or implementgetCascadedSoftDeletes
method which must return a list of cascaded HasMany relations and/or custom queries.
Testing
composer test