assettv/laravel-cascaded-soft-deletes

Cascade soft delete for chosen relations

1.0.1 2025-06-04 07:26 UTC

This package is auto-updated.

Last update: 2025-06-16 10:10:15 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

Features

  1. Cascade Soft Delete for Relations
    Soft delete related records automatically when a parent is soft deleted.

  2. Cascade Restore for Relations
    Automatically restore related models if their deleted_at is later than or equal to the parent's restore date.

  3. Custom Query Support
    Use a custom query to control cascade actions.

  4. 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 implement getCascadedSoftDeletes method which must return a list of cascaded HasMany relations and/or custom queries.

Testing

composer test