如何级联(软)删除在GORM中有很多关系?

我正在使用GORM实现一些删除功能。我的想法是级联删除,当父行被删除时,子行也会被删除。我尝试了使用select删除。但它只会删除父记录。


func DeleteProject(db *gorm.DB, id uint) (Project, error) {

    var project Project

    if err := db.Select(clause.Associations).Delete(&project, id).Error; err != nil {

        return Project{}, err

    }

    return project, nil

}

我有以下模型:


type Project struct {

    ID           uint           `gorm:"primary_key" json:"id"`

    CreatedAt    time.Time      `json:"created_at"`

    UpdatedAt    time.Time      `json:"updated_at"`

    DeletedAt    gorm.DeletedAt `gorm:"index" json:"deleted_at"`

    TicketNumber string         `gorm:"size:6;unique;not null" json:"ticketnumber"`

    Name         string         `json:"name"`

    MailingList  string         `json:"mailinglist"`

    Environment  string         `gorm:"not null" json:"environment"`

    UserID       uint           `gorm:"index" json:"user_id"`

    Diagrams     []Diagram      `json:"diagrams"`

}


type Diagram struct {

    ID        uint           `gorm:"primary_key" json:"id"`

    CreatedAt time.Time      `json:"created_at"`

    UpdatedAt time.Time      `json:"updated_at"`

    DeletedAt gorm.DeletedAt `gorm:"index" json:"deleted_at"`

    Data      string         `json:"data"`

    ProjectID uint           `gorm:"index" json:"project_id"`

    Instances []Instance     `json:"instances"`

}


type Instance struct {

    ID        uint           `gorm:"primary_key" json:"id"`

    CreatedAt time.Time      `json:"created_at"`

    UpdatedAt time.Time      `json:"updated_at"`

    DeletedAt gorm.DeletedAt `gorm:"index" json:"deleted_at"`

    Key       uint           `json:"key"`

    DiagramID uint           `gorm:"index" json:"diagram_id"`

}

其中,一个项目可以有多个关系图,而一个关系图可以有多个实例。但是当我运行该函数时,它只会删除而不是关联的图和实例。DeleteProjectProject


在这种情况下,如何删除项目及其关联的图表和实例?


慕慕森
浏览 315回答 1
1回答

温温酱

我找到了一个解决方案,但我认为它不是级联删除的最佳选择,它至少解决了我的问题。我编写了以下内容:首先是函数,我循环访问所有函数并调用函数,最后在删除项目之前清除与此项目的所有关联。DeleteProjectDiagramsDeleteDiagram//Delete a project and it's associations.func DeleteProject(db *gorm.DB, id uint) (Project, error) {    project, err := GetProject(db, id)    if err != nil {        return Project{}, err    }    if len(project.Diagrams) > 0 {        for _, projectDiagram := range project.Diagrams {            _, err := DeleteDiagram(db, projectDiagram.ID)            if err != nil {                return Project{}, err            }        }        db.Model(&project).Association("Diagrams").Clear()    }    if err := db.Delete(&project, id).Error; err != nil {        return Project{}, err    }    return project, nil}做同样的事情,但随后与DeleteDiagramInstances//Delete a diagram and it's associations.func DeleteDiagram(db *gorm.DB, id uint) (Diagram, error) {    var diagram, err = GetDiagram(db, id)    if err != nil {        return Diagram{}, err    }    if len(diagram.Instances) > 0 {        db.Model(&diagram).Association("Instances").Clear()        for _, diagramInstance := range diagram.Instances {            _, err := DeleteInstance(db, diagramInstance.ID)            if err != nil {                return Diagram{}, err            }        }    }    if err := db.Delete(&diagram).Error; err != nil {        return Diagram{}, err    }    return diagram, nil}希望它有帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go