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