我是ORM(和GORM)的新手,如果这是一个明显的问题,我深表歉意,但文档中似乎没有涉及到这一点.

我将以examples from the documentation分为基础回答我的问题

问题1:属于

// `User` belongs to `Company`, `CompanyID` is the foreign key
type User struct {
  gorm.Model
  Name      string
  CompanyID int
  Company   Company
}

type Company struct {
  ID   int
  Name string
}
  • User只属于一个Company→ 这是由代码处理的
  • Company有很多Useris this implied by the code above?或者我应该以某种方式在Company中添加一个关系O2M?

问题2:有很多

// User has many CreditCards, UserID is the foreign key
type User struct {
  gorm.Model
  CreditCards []CreditCard
}

type CreditCard struct {
  gorm.Model
  Number string
  UserID uint
}
  • User等于1+CreditCard→ 这是由代码处理的
  • A CreditCard can belong to several users (say, a shared family CC) → is it implied? (if not: how to set up the O2M relationship).
    Or is it, instead, a case where a CreditCard is explicitly configured to belong to only one user?

推荐答案

Q1:根据定义 struct 的方式,在Company struct 中不需要明确的O2M关系,但在加载公司详细信息时,如果要加载分配给该特定公司的所有用户,还需要添加该字段.它需要一个额外的函数调用,比如PreloadJoins,但不需要明确定义这种关系.

type Company struct {
  ID   int
  Name string
  Users []User
}

Q2:按照现在定义关系的方式,将其配置为CreditCard只属于一个用户.如果需要多个关系,则需要指定关系表.有更多关于它的文档,但它应该是这样的:

type User struct {
  gorm.Model
  CreditCards []CreditCard `gorm:"many2many:users_creditcards"`
}

type CreditCard struct {
  gorm.Model
  Number string
}

Go相关问答推荐

VS代码,Golang格式顽固的情况与switch / case

golang 的持久隐蔽服务

Makefilego version和read命令

如何为循环扫描的bufio scanner 设置超时?

testcontainers:如何修复绑定源路径不存在

正确的 shell 程序进入 golang alpine docker 容器的入口点?

用于提取 <*n 的正则表达式(其中 n 是一个数字)

GoLang:net.LookupHost 返回重复的 ips

golang:解组动态 YAML 注释

如何从 Asterisk Manager Interface Event 获取活动呼叫数

Golang 通过接口反映/迭代{}

无法使用 Golang 扫描文件路径

如何在gin中获取参数值数组

curl:(56)Recv失败:连接由golang中的对等方与docker重置

为什么 go-cmp Equal() 说 struct 不是完全相等的,即使所有字段都非常相等?

如何扩充 ResponseWriter 的 Header() 返回的 map

map和struct golang的合并

在 etcd 键值存储中禁用历史记录

Beego - 我需要context.Context而不是 Beego 上下文

为什么 Go 不允许将一个泛型分配给另一个泛型?