2016-05-19 3 views
1

У меня есть Lesson модель с поля ниже:Автоматическое удаление связанных моделей на удаление выбранной модели в Laravel

lesson_id 
title 
start_date 
end_date 

И в Content модели, которые имеют эти поля:

content_id 
lesson_id 
contentable_id 
contentable_type 
order 

OneToMany отношения находится между Lesson и Content.

Кроме того, у меня есть две другие модели, названные Unit с этими полями:

unit_id 
title 
time 

И Test этими:

test_id 
title 
description 

Содержимое contentable_type и contentable_id атрибуты имеет единицы (или тестирования) данные, относящиеся к к конкретному уроку.

Например, в области contentable_type контента может вставить только App \ Блок или App \ Тест строку и contentable_id имеет идентификатор этого блока или Test.

(Будьте осторожны, чтобы модели содержимого не создать морфинга отношения между этими таблицами и я создал это обусловленно Я хочу дать заказа возможность для единиц и испытания урока)

Теперь предположим, что я хочу, чтобы удалить конкретный контент и связанные с ним единицы (или тесты).

Удаление экземпляра модели контента легко, но для удаления соответствующего модуля (или теста) я должен получить соответствующее имя модели от contentable_type и его идентификатор затем выбрать и удалить его.

Для этого я написал:

public function destroy ($course_id, $lesson_id, $content_id) 
{ 
    $content = Content::findOrFail($content_id); 
    $modelName = $content->contentable_type; 

    $modelName::find($content->contentable_id)->delete(); 
    $content->delete(); 
} 

Несмотря на работу должным образом, но я думаю, что не очень удобно. Я ищу способ, который при удалении модели контента автоматически находит связанную модель и удаляет ее.

Что является лучшим и правильным решением?

+0

Вы можете добавить ограничение внешнего ключа и добавить каскад onDelete в миграции, поэтому удаление будет автоматически сохранено на уровне базы данных. Подробнее здесь - https://laravel.com/docs/5.2/migrations#foreign-key-constraints – naneri

+0

Название модели, привязанное к ситве. В поле 'contentable_type' в качестве строки я не могу использовать преимущества внешнего ключа. если может в этом случае вести меня. –

+0

извините, мой плохой, не заметил – naneri

ответ

0

В этом случае я просто делаю эти изменения:

public function destroy ($course_id, $lesson_id, $content_id) 
     { 
      $content = Content::findOrFail($content_id); 
      $content->delete(); 
     } 

И в Content Model:

public static function boot() 
     { 
      static::deleting(function ($content) { 

       $modelName = $content->contentable_type; 
       $modelName::find($content->contentable_id)->delete(); 
      }); 
     } 

Это прекрасно работает. Но сделайте это самое лучшее и самое правильное решение?

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