为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕慕森 2022-09-05 17:02:46
我正在使用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在这种情况下,如何删除项目及其关联的图表和实例?
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

我找到了一个解决方案,但我认为它不是级联删除的最佳选择,它至少解决了我的问题。我编写了以下内容:


首先是函数,我循环访问所有函数并调用函数,最后在删除项目之前清除与此项目的所有关联。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

}


希望它有帮助。


查看完整回答
反对 回复 2022-09-05
  • 1 回答
  • 0 关注
  • 314 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信