如何用GORM(Go)处理级联操作

如何用GORM(Go)处理级联操作,go,cascade,operation,go-gorm,Go,Cascade,Operation,Go Gorm,我正在测试Go的GORM lib。 我发现这个库特别有用,我一步一步地处理越来越复杂的概念 我面临着连锁经营管理的问题 在某些问题上,创建者建议使用AfterDelete。 问题是:在After/BeforeDelete函数中,嵌套项不存在 每个人都有一个很好的方法来实现这一点吗 以下是我的代码(如果有人发现Gorm,几乎可以正常工作): 感谢我已实施此解决方案来解决我的问题: func DeleteContentCascade(content *Content, db *gorm.DB, de

我正在测试Go的GORM lib。 我发现这个库特别有用,我一步一步地处理越来越复杂的概念

我面临着连锁经营管理的问题

在某些问题上,创建者建议使用AfterDelete。 问题是:在After/BeforeDelete函数中,嵌套项不存在

每个人都有一个很好的方法来实现这一点吗

以下是我的代码(如果有人发现Gorm,几乎可以正常工作):


感谢

我已实施此解决方案来解决我的问题:

func DeleteContentCascade(content *Content, db *gorm.DB, debug bool) error {

  if debug {
      db = db.Debug()
  }

  for _, child := range content.Children {
      DeleteChildCascade(&child, db, debug) //Custom method like the current
  }

  if err := db.Delete(content).Error; err != nil {
      return err
  }

  return nil
}
对于数据库管理中的每个“项”文件,我都创建了一个自定义函数DeleteCascade


我希望它能有所帮助:)

要执行级联排除,必须在表之间添加外键

这是我使用的一个示例,其中任务历史记录链接到任务。当我删除任务时,它已经删除了历史记录

添加外键

// Add foreign key
// 1st param : foreignkey field
// 2nd param : destination table(id)
// 3rd param : ONDELETE
// 4th param : ONUPDATE
db.Model(&User{}).AddForeignKey("city_id", "cities(id)", "RESTRICT", "RESTRICT")
我的例子:

db.Model(&models.TaskHistoric{}).AddForeignKey("task_uuid", "tasks(uuid)", "CASCADE", "CASCADE")
这对我有用

上下文: 删除bucketlist模型实例时,也会使用AfterDelete挂钩删除相应的项(1到x)

db.Model(&models.TaskHistoric{}).AddForeignKey("task_uuid", "tasks(uuid)", "CASCADE", "CASCADE")
type Bucketlist struct {
    gorm.Model
    Name      string           `json:"name"`
    CreatedBy string           `json:"created_by"`
    UserID    uint             `json:"user_id"`
    Item      []BucketlistItem `json:"item"`
}

type BucketlistItem struct {
    gorm.Model
    Name         string `json:"name"`
    Done         bool   `json:"done"`
    BucketlistID uint   `json:"bucketlist_id,omitempty"`
}

// AfterDelete hook defined for cascade delete
func (bucketlist *Bucketlist) AfterDelete(tx *gorm.DB) error {
    return tx.Model(&BucketlistItem{}).Where("bucketlist_id = ?", bucketlist.ID).Unscoped().Delete(&BucketlistItem{}).Error
}