За последние 24 часа нас посетили 18889 программистов и 1605 роботов. Сейчас ищут 995 программистов ...

Удаление связанных моделей

Тема в разделе "Laravel", создана пользователем websoul, 8 янв 2022.

Метки:
  1. websoul

    websoul Новичок

    С нами с:
    19 ноя 2021
    Сообщения:
    5
    Симпатии:
    0
    Здравствуйте!

    Изучаю Laravel. Чему-то уже научился и взялся за задачу посложнее. И упёрся... Прошу помощи.

    Суть вопроса:

    Система тестирования сотрудников.

    Есть Тест, у него есть Темы, у Темы есть Вопросы, у Вопроса есть Ответы.

    Связи в моделях построены и работает всё правильно.

    Если я хочу удалить Вопрос, то я поступаю так:

    Код (Text):
    1.  
    2. $question->answers()->delete(); // удаляю ответы к вопросу
    3. $question->delete(); // удаляю сам вопрос
    Всё удаляется.

    А как поступать, когда я хочу удалить Тему? Мне надо удалить Вопросы (которые связанны с Темой) и Ответы (которые связанны с вопросами).

    Я, конечно, могу по PHPшному - получить id вопросов, по ним получить id ответов к каждому из них и по очереди это всё удалить. Но мне кажется, что это будет как-то не по ларавельски. Как сделать это правильно?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    1. Сделать связь на уровне БД с onDelete("cascade") (см. доку по миграциям)
    2. Удалить массово сложным запросом через Query Builder (через подзапрос получить айди всех вопросов, связанных с темой, этот подзапрос передать в удаление ответов)
    --- Добавлено ---
    https://www.w3resource.com/sql/delete-statement/delete-with-subqueries.php
     
    websoul нравится это.
  3. websoul

    websoul Новичок

    С нами с:
    19 ноя 2021
    Сообщения:
    5
    Симпатии:
    0
    Благодарю! Буду разбираться.
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.854
    Симпатии:
    748
    Адрес:
    Татарстан
    Если нужно удалять не только записи в бд, но и какие то дополнительные вещи - например файлы по ссылкам и прочее, в модели можно в booting рассматривать нужные события, например deleting
     
    websoul нравится это.
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    При массовых удалениях события идут лесом
     
    websoul нравится это.
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.854
    Симпатии:
    748
    Адрес:
    Татарстан
    это да...