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

8dtrkrch  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(155)

我有两个主要的域实体,User和Project,它们具有多对多的关系。当我试图从另一个引用它们时(即,User中的一个项目切片和Project中的一个用户切片),我最终在包结构中得到了一个循环依赖。下面是我的模型的简化版本:

// 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语言中处理这种情况的惯用方法是什么?任何指针或例子将不胜感激!提前感谢!

bihw5rsg

bihw5rsg1#

尝试将所有模型移动到单独的包中,例如:

package model

type User struct {
    gorm.Model
    ...
    Projects []Project `gorm:"many2many:user_projects;"`
}

type Project struct {
    gorm.Model
    ...
    Users []User `gorm:"many2many:user_projects;"`
}

软件包用户:

package user
...
func SetUser(user *model.User) {
 ...
}

Package 项目:

package Project
...
func SetProject(project *model.Project) {
 ...
}

相关问题