Как правильно удалить одну многоуровневую ветку?

Хеллоу!

Суть задачи такова, есть yii2 gridview, там выводиться многоуровневое категории любой глубины вложенности и надо сделать так что бы когда юзер удаляет родителя за ним должны удалиться дети, а за ними еще дети и так до бесконечности, смотря какая вложенность.
Тут на мысль меня наталкивает рекурсия, если да, то как правильно ее составить?

бд category:
id | parent_id | status | title | ....

В контроллере CategoryController. Я сделал только удаления второй вложенности, а вот третью вложенность не могу осилить.
На картинке видно три вложенности их может быть 5 или 10, как правильно реализовать массовое удаление!
public function actionDelete($id)
    {
       $child = Category::find()->where(['parent_id' => $id])->one();
        if ($child->parent_id != null) {
            $child->delete();
        }

        $this->findModel($id)->delete();
        return $this->redirect(['index']);
    }


a5e49ffc70.png
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 2
VladimirAndreev
@VladimirAndreev
php web dev
Самый хороший способ - добавить внешний ключ с роя id на поле parent_id и свойством cascade в on delete.
Ну, или в цикле, без рекурсии, у тебя есть id, получаешь всех id, у кого он parent_id, ищешь по ним тем же способом. Когда набор пустой - останавливаешь цикл.
Ответ написан
kimono
@kimono
Web developer
Попробуйте использовать nested sets или materialized path для этой таблицы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы