matfish2 / eloquent-cascade by matfish2

Cascading delete trait for Laravel's Eloquent
2,058
3
1
Package Data
Maintainer Username: matfish2
Maintainer Contact: matfish2@gmail.com (Matanya Fishaimer)
Package Create Date: 2016-01-25
Package Last Update: 2016-08-11
Home Page: https://packagist.org/packages/fish/eloquent-cascade
Language: PHP
License: MIT
Last Refreshed: 2024-12-11 15:09:12
Package Statistics
Total Downloads: 2,058
Monthly Downloads: 2
Daily Downloads: 0
Total Stars: 3
Total Watchers: 1
Total Forks: 1
Total Open Issues: 0

Laravel Eloquent Cascading Delete

Latest Stable Version Total Downloads Latest Unstable Version License Build Status

This package offers a simple trait that leverages the Eloquent delete event to recursively delete all specified relations for a given model.

Installation

Begin by installing this package through Composer. Edit your project's composer.json file to require fish/eloquent-cascade.

"require": {
  "fish/eloquent-cascade": "^1.0"
}

Next, update Composer from the Terminal:

composer update

Usage

  1. Include the trait in a parent model and make the other models extend it:

     namespace App;
    
     use Illuminate\Database\Eloquent\Model;
     use Fish\Cascade\Cascade;
    
     class BaseModel extends Model
     {
         use Cascade;
     }
    
  2. Add the relations you wish to delete to a protected $cascade array on the model. e.g:

     class User extends BaseModel
     {
    
         protected $cascade = ['author'];
    
         public function author() {
    
           return $this->hasOne(Author::class);
    
         }
     }
    
     class Author extends BaseModel
     {
    
         protected $cascade = ['posts'];
    
         public function user() {
    
           return $this->belongsTo(User::class);
    
         }
    
         public function posts() {
    
           return $this->hasMany(Post::class);
    
         }
    
     }
    
     class Post extends BaseModel
     {
    
       protected $cascade = ['comments'];
    
       public function comments() {
    
         return $this->hasMany(Comment::class);
    
       }
    
     }
    

If you are using a trait for polymorphic relations and want to add this relation to the $cascade array, override the protected getCascade method. Suppose you have a Locale trait:

   trait Locale {

    public function locale() {
        return $this->morphMany(Locale::class, 'translatable');
    }

    protected function getCascade() {
      return array_merge($this->cascade, ['locale']);
    }

   }