Удалить категории со всеми дочерними элементами, полученными из родительской категории - PullRequest
0 голосов
/ 01 февраля 2020

Я хочу удалить все связанные дочерние категории из родительских категорий. Я думаю, что мне нужна рекурсивная функция для решения этой проблемы. Вот моя попытка:

public function destroy(Request $request)
{
    $categories = \App\Categories::select('parent_id')->whereNotNull('parent_id')->get();

    foreach ($categories as $category) {
       if ($category->parent_id == $request->cid) {
           $childCategories = \App\Categories::select('parent_id')->where('parent_id', $category->parent_id)->get();

       }
    }

}

Моя таблица выглядит следующим образом

+-------------+----------+-----------+
|  id         | name     | parent_id |
+-------------+----------+-----------+
|  1          | MAIN     |   NULL    |
+-------------+----------+-----------+
|  2          | CHILD    |     1     |
+-------------+----------+-----------+
|  3          | CHILD 2  |     2     |
+-------------+----------+-----------+

Мои ожидания:

Если я удалил основную категорию, ребенок и ребенок Необходимо удалить 2 категории.

Как я могу выполнить это с eloquent?

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

РЕШЕНИЕ

Я исправил эту проблему с помощью миграций.

Я создал FOREIGN KEY для PARENT_ID, который ссылается на к идентификатору категории в файле миграции. Когда я выполняю действие удаления, оно удаляет себя с дочерними узлами (это работает также в том случае, если у его дочерних узлов есть дочерние узлы).

Вот код миграции, который я использовал:

$ table- > иностранный ( 'parent_id') -> ссылки ( 'ID') -> по ( 'категорий') -> OnDelete ( 'каскад'); Тогда

App \ Categories :: find ($ id) -> delete (); удалено с дочерними узлами.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Я исправил эту проблему с помощью миграций.

Я создал FOREIGN KEY для PARENT_ID, который ссылается на идентификатор категории в файле миграции. Когда я выполняю действие удаления, оно удаляет себя с дочерними узлами (это работает также в том случае, если у его дочерних узлов есть дочерние узлы).

Вот код миграции, который я использовал:

$table->foreign('parent_id')->references('id')->on('categories')->onDelete('cascade');

Затем

App\Categories::find($id)->delete(); удаляется с дочерними узлами.

0 голосов
/ 01 февраля 2020

Вам также необходимо проверить дочерние записи дочерней категории. Будете ли вы располагать данными еще глубже?

Лучше, если вы повторите

foreach ($categories as $category) {

внутри также с дочерней категорией, чтобы найти, существует ли ребенок внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...