Deleting related models one-to-many in Laravel
laravel, laravel-4, php
Solution
You can approach this in two ways:
Leverage the database to do the deleting for you. You'd add something like this to your migrations for the `lessons`, `levels` and `packages`, respectively:
$table->foreign('level_id')->references('id')->on('levels')->onDelete('cascade');
$table->foreign('lesson_id')->references('id')->on('lessons')->onDelete('cascade');
$table->foreign('package_id')->references('id')->on('packages')->onDelete('cascade');
You can overwrite the `delete` method on each model to delete all of its relationships:
class Lesson extends Eloquent {
protected $table = 'lessons';
public function phases(){
return $this->hasMany('Phase', 'lesson_id');
}
public function level(){
return $this->belongsTo('Level', 'level_id');
}
public function delete()
{
DB::transaction(function()
{
$this->level()->delete();
$this->phases()->delete();
parent::delete();
});
}
}
Problem
Is this even possible? In every tutorial that I read there is nothing about deleting, only selecting and inserting related models. This is my problem: I have three levels of nesting. I have classes Package, Level, Lesson and Phase, and their models are below. First one - packages: ``` class Package extends Eloquent { protected $table = 'packages'; public $timestamps = false; public function levels(){ return $this->hasMany('Level', 'package_id'); } ``` } Levels: ``` class Level extends Eloquent { protected $table = 'levels'; public function lessons(){ return $this->hasMany('Lesson', 'level_id'); } public function package(){ return $this->belongsTo('Package', 'package_id'); } ``` } Lessons: class Lesson extends Eloquent { ``` protected $table = 'lessons'; public function phases(){ return $this->hasMany('Phase', 'lesson_id'); } public function level(){ return $this->belongsTo('Level', 'level_id'); } ``` } What I'm trying to do here is to when deleting one package i delete all levels related to it and also to delete all lessons related to those levels. I have tried couple of options and they were all wrong, I just don't know how to do this without making a bunch of queries in foreach loop. Please, give some advice I'm so desperate I'm thinking about tweet to Jeffrey Way and ask him for the solution :) Thanks in advance