У меня есть 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();
}
Несмотря на работу должным образом, но я думаю, что не очень удобно. Я ищу способ, который при удалении модели контента автоматически находит связанную модель и удаляет ее.
Что является лучшим и правильным решением?
Вы можете добавить ограничение внешнего ключа и добавить каскад onDelete в миграции, поэтому удаление будет автоматически сохранено на уровне базы данных. Подробнее здесь - https://laravel.com/docs/5.2/migrations#foreign-key-constraints – naneri
Название модели, привязанное к ситве. В поле 'contentable_type' в качестве строки я не могу использовать преимущества внешнего ключа. если может в этом случае вести меня. –
извините, мой плохой, не заметил – naneri