ZBLOG

你的插入父节点函数和删除节点函数,都没有从其父节点中的子节点列表中删除该节点的id

非常抱歉,我理解错误。你正确指出了删除节点时需要从其父节点的子节点列表中删除该节点的ID。以下是更新后的代码示例:

type NginxResourceGroup struct {
	ID         int
	Pid        int
	Name       string
	ChildNodes []NginxResourceGroup // 子节点列表
}

func deleteNode(db *gorm.DB, nodeID int) error {
	var node NginxResourceGroup

	// 查询待删除节点是否存在
	if err := db.Where("ID = ?", nodeID).First(&node).Error; err != nil {
		return errors.New("待删除节点不存在")
	}

	// 删除当前节点及其所有子节点
	if err := deleteRecursive(db, &node); err != nil {
		return err
	}

	return nil
}

func deleteRecursive(db *gorm.DB, node *NginxResourceGroup) error {
	for i := range node.ChildNodes {
		childNode := &node.ChildNodes[i]
		
        if err := deleteRecursive(db, childNode); err != nil { // 递归删除子节点的子节点
            return err 
        }
        
        if err := db.Delete(childNode).Error; err != nil { // 删除当前子节点记录
            return err 
        }
    }

    // 从父节点的子节点列表中删除当前节点
    parentNode := &NginxResourceGroup{}
    if node.Pid > 0 && db.First(parentNode, "ID = ?", node.Pid).RowsAffected > 0 {
        for i, child := range parentNode.ChildNodes {
            if child.ID == node.ID {
                parentNode.ChildNodes = append(parentNode.ChildNodes[:i], parentNode.ChildNodes[i+1:]...)
                break
            }
        }
        db.Save(parentNode)
    }

    return nil 
}

上述代码中,在 deleteRecursive() 函数中,除了删除当前节点及其子节点记录外,还添加了从父节点的子节点列表中删除当前节点的逻辑。通过查询到父节点,并在循环中找到当前节点后进行删除操作。

同样,请注意根据你的实际数据结构和库选择对代码进行适当修改。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=14034

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?