2015-03-12 2 views
2

Как удалить отношения отношения отношения на laravel 4.2? Например, у меня есть таблица, называемая категорией, которая связана с подкатегорией. Таким образом, идентификатор категории связан с подкатегорией как внешним ключом и отображается для каскадного удаления в моих миграциях. Теперь таблица подкатегорий имеет отношения с таблицей объектов. Таким образом, идентификатор подкатегории связан с объектами как внешним ключом и отображается для каскада при удалении. Теперь, когда я удаляю категорию, подкатегория удаляется, и это нормально. Но так как подкатегория удаляется, даже объекты тоже должны быть удалены правильно? Но это не так. Как это решить? Ниже мой код.Laravel Eloquent удалить отношение таблица

Категория Модель

use Illuminate\Database\Eloquent\SoftDeletingTrait; 

class Category extends Eloquent{ 

use SoftDeletingTrait; 

protected $dates = ['deleted_at']; 

protected $table = "categories"; 

public function subcategory(){ 
    return $this->hasMany('Subcategory', 'category_id'); 
} 

public static function boot() 
{ 
    parent::boot(); 

    Category::deleting(function($category) { 
     $category->subcategory()->delete(); 
    }); 
} 
} 

SubCategory модель

use Illuminate\Database\Eloquent\SoftDeletingTrait; 

class Subcategory extends Eloquent{ 

use SoftDeletingTrait; 

protected $dates = ['deleted_at']; 

public $timestamps = false; 

protected $table = "subcategories"; 

public function parent(){ 
    return $this->belongsTo('Category', 'category_id'); 
} 

public function objects(){ 
    return $this->hasMany('Object', 'subcategory_id'); 
} 

public static function boot() 
{ 
    parent::boot(); 

    Subcategory::deleting(function($subcategory) { 
     $subcategory->objects()->delete(); 
    }); 

} 
} 
+0

Так что, когда у ou call '$ someCategory-> delete()', на обе страницы _categories_ и _subcategories_ влияет удаление категории и связанных с ней подкатегорий, правильно? В этом случае я думаю, что у вас есть то, что вам нужно, а остальные объекты являются ссылками на записи, которые больше не существуют в базе данных, поэтому вы можете просто выполнить '$ someCategory = NULL' после удаления, и это должно уничтожить устаревшие ссылки в вашем PHP код. – jpina

+0

Ничего не будет удалено. Я делаю только мягкое удаление. $ category-> delete() будет мягко удалять подкатегорию. Но так как подкатегория теперь мягко удалена, то ее связанные таблицы (объекты) должны быть мягко удалены правильно? –

ответ

0

Вам нужно позвонить ->delete() на каждой модели непосредственно вызвать связанные модели события

Category::deleting(function($category) { 
    foreach($category->subcategory as $subcategory){ 
     $subcategory->delete(); 
    } 
}); 
+0

Выше кода удаляет подкатегорию отлично. Но вместо удаления связанных объектов удаленной подкатегории он удаляет все объекты? Любая идея почему? –

Смежные вопросы