2017-01-27 1 views
0

Я пытаюсь удалить полиморфные элементы/отношения при удалении родителя.Удалить полиморфные элементы Laravel 5.3 при удалении родительского элемента через каскад

Моя структура;

- User (hasMany: Page) 
- - Page (hasMany: Module, belongsTo: User) 
- - - - Module (belongsTo: Page, morphTo: content()) 
- - - - - ModuleVideo (morphMany: 'content') 
- - - - - ModuleAudio (morphMany: 'content') 
- - - - - ModuleSomething (morphMany: 'content') 

можно удалить модуль и ModuleItem пингуется Module непосредственно;

$module->forceDelete(); 
$module->content->forceDelete(); 

User > Page > Module все настройки так onDelete они каскадом вниз.

Как принудительно удалить ModuleVideo/Audio/Something, если кто-либо из родителей (Page или User) удален?

+0

Можете ли вы прояснить немного проблемы? Я не понял последнее предложение, это вопрос или просто информация? –

+0

Я немного переформулировал это: Как заставить «ModuleItem» удалить, если какой-либо из родителей («Страница» или «Пользователь») удалены? –

+0

Где ModuleItem в ваших нынешних отношениях? Это ModuleVideo/Audio/Something? –

ответ

0

Вы можете попробовать создать признак, как этого

trait Cascadable { 

public static function bootCascade() 
{ 
    static::deleting(function ($model) { 
    if (property_exists($model, 'cascade') && is_array($model->cascade)) { 
     foreach ($model->getCascade() as $relation) { 
     if (method_exists($model, $relation)) { 
      foreach ($model->{$relation}()->get() as $related) 
      $related->delete(); 
     } 
     } 
    } 
    }); 
} 

protected function getCascade() { 
    return $this->cascade; 
} 

и использовать в своих классах, определив защищенный переменный $ каскадного в каждом классе

+0

Спасибо, я проведу этот вечер. Использовать ли этот признак в классе модуля? –

+0

Да, вы можете создать класс ModelItem, который будет расширять модель и использовать Cascadable trait, тогда все ваши классы предметов расширяют класс ModelItem –

+0

. Я попробую попробовать –

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