У меня есть меню таблицы с столбцом: 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);
Как найти остальных детей с помощью цикла или рекурсии?
Подходит ли это для этого стола?
для этого метода должно быть 2 таблицы? Я правильно понял?
Это зависит только от ограничения внешнего ключа
Это выглядело так: ALTER TABLE menu ADD CONSTRAINT menu_menu_id_fk FOREIGN KEY (id_parent) REFERENCES menu (id) ON DELETE CASCADE ;? правильно?
Итак, вы обнаружили, что MySQL (по крайней мере, исторически) не имеет возможности рекурсии. Соответственно, широко обсуждаются варианты обработки иерархических данных.






Я бы создал переменную функцию, которую я передал бы себе по ссылке, возможно, лучшие способы сделать это, но я создал древовидный навигатор, используя этот метод, и он отлично работает
Я бы просто проверил, есть ли дочерний элемент под этим идентификатором, если есть цикл, хотя они, пока не будет больше дочерних элементов, после этого удалите идентификатор
это непроверенный код и своего рода псевдокод, но вы поймете идею
$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 раз написать одно и то же? Мне нужен универсальный метод с рекурсией
как удалить из таблицы по идентификатору я знаю)
для этого вы можете использовать mysql_trigger mysql_trigger.
Я рекомендую рекурсивную функцию, чтобы найти всех его детей. Что вы хотите, чтобы на одном уровне было несколько детей?
ОБНОВЛЕНИЕ: Плохо, я не хотел оставлять вас в подвешенном состоянии ... Вот код для рекурсивной функции. По сути, это то же самое, что я использую для отображения меню, за исключением того, что оно урезано и переработано для ваших целей.
Я использую pk_ID, Menu_Item и Menu_Parent для столбцов данных.
Я очень надеюсь, что это тебе поможет.
- Call the recursive function which will return a string of itself and all child Items.
- Convert to an array.
- 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
Я не знаю как это написать
удали их тоже
установите ваши ограничения правильно dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.ht мл