下面是根据你的需求,补充了检查是否会破坏树形结构的代码:
func insertNode(db *gorm.DB, newNode NginxResourceGroup) error {
// 检查父节点是否存在或者为根节点
if newNode.Pid != 1 {
var parentNode NginxResourceGroup
if err := db.Where("ID = ?", newNode.Pid).First(&parentNode).Error; err != nil {
return errors.New("父节点不存在")
}
}
// 检查是否会破坏树形结构
var existingChildren []int
if err := db.Model(NginxResourceGroup{}).
Where("Pid = ?", newNode.Pid).
Pluck("ID", &existingChildren).Error; err != nil {
return err
}
// 判断插入后是否会破坏树形结构,即新节点的子节点中包含父节点或者新节点已经是其他节点的子孙节点
for _, childID := range newNode.Children {
if childID == newNode.ID || contains(existingChildren, childID) {
return errors.New("插入将导致破坏树形结构")
}
}
// 插入新节点到数据库
return nil
}
// 判断一个切片中是否包含某个元素
func contains(slice []int, element int) bool {
for _, item := range slice {
if item == element {
return true
}
}
return false
}
上述代码首先通过查询数据库获取当前父节点已经存在的子节点列表,然后遍历新节点的子节点列表,判断是否会导致破坏树形结构。如果满足条件,则插入新节点到数据库中;否则,返回错误信息。请根据实际需求进行适当修改和完善。
内容由零声教学AI助手提供,问题来源于学员提问