【问题标题】:How to delete a node from nested model set with PHP and MYSQL如何使用 PHP 和 MYSQL 从嵌套模型集中删除节点
【发布时间】:2012-09-22 05:06:03
【问题描述】:

我的问题是使用 PHP 和 MYSQL 删除嵌套模型集中的节点的正确方法是什么。就我而言,我必须将所有大于节点的左值递减 2 以删除的左值。但是我对接下来的步骤很困惑。非常感谢您的回答。

这是我的功能:

public function deleteNode($id,$left,$right)
{
    //?

}

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    我刚刚从 Mike Hillyers 那里找到了解决方案

    public function delete_node($id)
    {
    
        $query = $this->db->query("
            SELECT node.label
            FROM menus AS node,menus AS parent
            WHERE node.lft BETWEEN parent.lft AND parent.rft AND parent.id = $id
            GROUP BY node.label
            ORDER BY node.lft
        ");
    
        if($query->num_rows() > 1)
        {
            $this->db->trans_start();
            $this->db->query("LOCK TABLE $this->table WRITE");
            $this->db->query("SELECT @myLeft := lft, @myRight := rft, @myWidth := rft - lft + 1 FROM $this->table WHERE id = $id");
            $this->db->query("DELETE FROM $this->table WHERE lft = @myLeft");
            $this->db->query("UPDATE $this->table SET rft = rft - 1, lft = lft - 1 WHERE lft BETWEEN @myLeft AND @myRight");
            $this->db->query("UPDATE $this->table SET rft = rft - 2 WHERE rft > @myRight");
            $this->db->query("UPDATE $this->table SET lft = lft - 2 WHERE lft > @myRight");
            $this->db->query("UNLOCK TABLES");
            $this->db->trans_complete();
    
            if ($this->db->trans_status() === FALSE)
            {
                return false;
            }
            else
            {
                return true;
            } 
        }
        else
        {
            $this->db->trans_start();
            $this->db->query("LOCK TABLE $this->table WRITE");
            $this->db->query("SELECT @myLeft := lft, @myRight := rft, @myWidth := rft - lft + 1 FROM $this->table WHERE id = $id");
            $this->db->query("DELETE FROM $this->table WHERE lft BETWEEN @myLeft AND @myRight");
            $this->db->query("UPDATE $this->table SET rft = rft - @myWidth WHERE rft > @myRight");
            $this->db->query("UPDATE $this->table SET lft = lft - @myWidth WHERE lft > @myRight");
            $this->db->query("UNLOCK TABLES");
            $this->db->trans_complete();
    
            if ($this->db->trans_status() === FALSE)
            {
                return false;
            }
            else
            {
                return true;
            }    
        }
    
    }
    

    【讨论】:

    • 第一个查询将检查要删除的主题是否有孩子。如果没有使用另一个,它将在 else 语句中使用事务
    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多