使用 GORM 处理 Go 中的多对多关系,同时避免循环依赖

问题描述 投票:0回答:1

我有两个主要域实体,用户和项目,它们具有多对多关系。当我尝试相互引用时(即,用户中的一部分项目和项目中的一部分用户),我最终在包结构中出现了循环依赖。这是我的模型的简化版本:

// in user package
type User struct {
    gorm.Model
    ...
    Projects []project.Project `gorm:"many2many:user_projects;"`
}

// in project package
type Project struct {
    gorm.Model
    ...
    Users []user.User `gorm:"many2many:user_projects;"`
}    

我理解为什么会发生循环依赖,但我正在努力寻找重组代码的最佳方法,以维持这种多对多关系,同时保持 Go 中的惯用语。我考虑过的一些解决方案:

  • 将引用从项目放回到用户。
  • 引入中间 UserProject 类型(本质上代表联接表)。
  • 使用接口。

Go 中处理此类情况的惯用方法是什么?任何指针或示例将不胜感激!提前致谢!

go domain-driven-design go-gorm circular-dependency
1个回答
0
投票

我的建议是启用一个新的

dto
域实体作为查询结果对象。有时我需要附加额外的表并获取字段,以便可以轻松扩展
dto
对象。喜欢:

type UserDto struct{
    // embed the original object, or just the necessary field
    user.User
    Projects []project.Project `gorm:"many2many:user_projects;"`

    OtherField int
    ...
}

type ProjectDto struct{
    project.Project
    Users []user.User `gorm:"many2many:user_projects;"`

    OtherField int
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.