前序遍历亲子动态插入不工作(Preorder traversal parent-child dyna

2019-10-17 01:51发布

我有以下数据库:

id  name            unit_id lft rgt level
--  --------------  ------- --- --- -----
1   Company Name    1       1   2   0
2   Manager         2       2   9   1
3   HR              3       3   8   2
4   Jr.Manager      5       5   8   2
5   Sr.Manager      8       7   8   2

我想在上面序遍历表中插入记录。 为此,我用下面的代码和查询:

function addstructure() {
        $level = $_GET['level'] + 1;
        $rgt = $_GET['rgt'] + 1;
        if ($_GET['level'] == 0) {
            $sql = "UPDATE xp_subunit SET lft = lft+2, rgt=rgt+2 WHERE rgt > " . $_GET['rgt'] . "; ";
            $this->db->query($sql);
            $sql = "INSERT INTO xp_subunit SET level=" . $level . ", lft =" . $_GET['rgt'] . ", rgt =  " . $rgt . " , name = '" . $_GET['name'] . "', unit_id='" . $_GET['unit_id'] . "', description='" . $_GET['description'] . "';";
            $this->db->query($sql);
        } else {
            $sql = "UPDATE xp_subunit SET rgt = rgt+2 WHERE rgt > " . $_GET['lft'] . "; ";
            $this->db->query($sql);
            $sql = "INSERT INTO xp_subunit SET level=" . $level . ", lft =" . $_GET['rgt'] . ", rgt =  " . $rgt . " , name = '" . $_GET['name'] . "', unit_id='" . $_GET['unit_id'] . "', description='" . $_GET['description'] . "';";
            echo $this->db->query($sql);
        }
    }

我越来越LFT,RGT和水平的数据库。 问题是,当我试图插入记录前。 在管理类别Jr.Manager和Sr.Manager,它没有正确插入。 而不是“管理”类别下的HR-> Jr.Manager-> Sr.Manager如插入。 什么是错用上面的代码?

这是为了更好地理解图像:

Answer 1:

你开始指出,“等级”是你从一开始请求加一个获得任何级别。 它总是增加你的水平,所以它把JR。 在HR和SR经理。 下JR经理。 经理。

是否有必要增加从您的GET请求的水平?



Answer 2:

我稍微修改您的代码只是试试这个:

    $name = $_GET['name'];
    $rgt = $_GET['rgt'];
    $lft = $_GET['lft'];
    $level = $_GET['level'] + 1;
    $right = $rgt + 1;

    $sql1 = "UPDATE xp_subunit SET lft = lft+2 WHERE lft >= $rgt ;";
    $this->db->query($sql1);
    $sql2 = "UPDATE xp_subunit SET rgt = rgt+2 WHERE rgt >= $rgt ;";
    $this->db->query($sql2);
    $sql3 = "INSERT INTO xp_subunit (`id`,`name`,`unit_id`,`lft`, `rgt`, `level`)        
values (NULL, '$name', '$unit_id',$rgt, $right, '$level');";
    echo $this->db->query($sql3);

它会为你工作。



文章来源: Preorder traversal parent-child dynamic insertion not working