2

私の質問は、PHP と MYSQL を使用してネストされたモデル セット内のノードを削除する正しいアプローチは何かということです。私が懸念している限り、ノードの左の値よりも大きいすべての左の値を 2 ずつ減らす必要があります。ただし、次の手順で混乱しています。あなたの答えは非常に高く評価されます。

これは私の機能です:

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

}
4

1 に答える 1

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;
        }    
    }

}
于 2012-09-21T20:05:29.273 に答える