在多级菜单中删除子级

68bkxrlz  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(389)

我有带列的表格菜单: 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);

如何使用循环或递归找到其余的子级?

yebdmbv4

yebdmbv41#

因为你有一个 id ,只需使函数删除。示例:

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

wnrlj8wa2#

我会创建一个通过引用传递给自身的变量函数,这可能是更好的方法,但是我用这个方法创建了一个树导航器,它工作得非常好
我只需要检查这个id下是否有child,是否有循环,直到没有更多的child为止,一旦有了,就删除这个id
这是未经测试的代码和伪代码,但你会明白的

$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
}
tyu7yeag

tyu7yeag3#

我建议使用递归函数来查找他的所有子对象。如果同一级别有多个孩子,您希望发生什么?
更新:我的错,我不是故意让你悬着的。。。下面是一些递归函数的代码。它本质上与我用来显示菜单的方式相同,只是为了您的目的而进行了精简和重构。
我对数据列使用pk\u id、menu\u item和menu\u parent。
我真的希望这对你有帮助。
调用递归函数,该函数将返回自身和所有子项的字符串。
转换为数组。
循环遍历数组以删除所需内容。

$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

相关问题