Удалить детей в многоуровневом меню

У меня есть меню таблицы с столбцом: id, value, id_parent. И есть многоуровневое меню:

Item0
    Item1
        Item2
            Item3

Я хочу удалить Item1, а у меня его id. Как я могу удалить Item2 и Item3 при удалении Item1? Выбираю из таблицы:

public function searchChildren($id)
{
    $sql = "SELECT id FROM menu WHERE id_parent = '{$id}'";

    return $this->db->query($sql);
}

Я могу найти первого ребенка id:

$idChild = $this->model->search_children_id($id);

Как найти остальных детей с помощью цикла или рекурсии?

установите ваши ограничения правильно dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.ht‌ мл

arielnmz 04.05.2018 22:30

Подходит ли это для этого стола?

KvinT 04.05.2018 22:41

для этого метода должно быть 2 таблицы? Я правильно понял?

KvinT 04.05.2018 22:46

Это зависит только от ограничения внешнего ключа

arielnmz 04.05.2018 22:56

Это выглядело так: ALTER TABLE menu ADD CONSTRAINT menu_menu_id_fk FOREIGN KEY (id_parent) REFERENCES menu (id) ON DELETE CASCADE ;? правильно?

KvinT 04.05.2018 23:13

Итак, вы обнаружили, что MySQL (по крайней мере, исторически) не имеет возможности рекурсии. Соответственно, широко обсуждаются варианты обработки иерархических данных.

Strawberry 05.05.2018 01:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
6
116
3

Ответы 3

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

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

это непроверенный код и своего рода псевдокод, но вы поймете идею

$DeleteIdAndChilds= function($Id) use( &$DeleteIdAndChilds){
   while($ChildId = $this->model->search_children_id($Id) != null){
       $DeleteIdAndChilds($ChildId);
   }
   //once we are here there is no more child lets delete the $Id
}

Потому что у вас есть id, просто удалите функцию. пример:

function delete_menu($id){
   $this->db->where('id_parent', $id);
   $this->db->delete('menu');
}

а если 10 детей? 10 раз написать одно и то же? Мне нужен универсальный метод с рекурсией

KvinT 04.05.2018 22:20

как удалить из таблицы по идентификатору я знаю)

KvinT 04.05.2018 22:22

для этого вы можете использовать mysql_trigger mysql_trigger.

Tobok Sitanggang 05.05.2018 00:29

Я рекомендую рекурсивную функцию, чтобы найти всех его детей. Что вы хотите, чтобы на одном уровне было несколько детей?

ОБНОВЛЕНИЕ: Плохо, я не хотел оставлять вас в подвешенном состоянии ... Вот код для рекурсивной функции. По сути, это то же самое, что я использую для отображения меню, за исключением того, что оно урезано и переработано для ваших целей.

Я использую pk_ID, Menu_Item и Menu_Parent для столбцов данных.

Я очень надеюсь, что это тебе поможет.

  1. Call the recursive function which will return a string of itself and all child Items.
  2. Convert to an array.
  3. Loop through the array to delete what you want.
$menu = rtrim(($this->getMenu(0)), ","); 
$menu = explode(",", $menu);


public function getMenu($p_parentID=0) {
  $output = "";
  $data = $this->db->order_by("Menu_Parent, Menu_Item", "ASC")->get_where("my_menu", array(
    "Menu_Parent" => $p_parentID,
  ));
  foreach ($data->result() as $row) {
    $output .= "{$row->Menu_Item}<br>";
    if ($this->hasChildren($row->pk_ID)) {
      $output .= $this->getMenu($row->pk_ID);
    }
  }
  return $output;
} # END FUNCTION getMenu


public function hasChildren($p_value=0) {
  $data = $this->db->get_where("my_menu", array(
    "Menu_Parent" => $p_value
  ));
  $result = $data->num_rows();
  return $result;
} # END FUNCTION hasChildren

Я не знаю как это написать

KvinT 04.05.2018 22:48

удали их тоже

KvinT 06.05.2018 00:22

Другие вопросы по теме