属于(belongs to)关联创建与另外一模型的一对一链接,使得声明模型的每一个实例“属于”另外一模型的一个实例。ui
例如,若是您的应用程序包含用户和配置文件,则每一个配置文件只能分配给一个用户。code
Profile 属于 User, User 是 Profile 的全部者。orm
定义模型:ci
type User struct { gorm.Model Name string } // Profile belongs to User, UserID is foreign key // Profile 属于 User,UserID 是外键 type Profile struct { gorm.Model Name string User User UserID uint }
profiles 表的 user_id 列是外键,它引用 users 表的 id 列。string
要定义属于关系,外键必须存在,默认外键 = 全部者(此处为 User)的类型 + 其主键。io
对于上面的示例,要定义属于 User 的模型,外键应为 User + ID = UserID。class
外键字段类型最好与它引用的字段类型一致,这里 Profile.UserID 的类型与 User.ID 的类型都为 uint。配置
GORM提供了一种自定义外键名的方法,例如:file
type User struct { gorm.Model Name string } type Profile struct { gorm.Model Name string User User `gorm:"foreignkey:UserRefer"` // use UserRefer as foreign key UserRefer uint }
把 profiles 表的引用 users 表 id 列的外键改为 user_refer(默认应该为user_id)。tag 须要写在从属者结构体的类型为全部者的字段上,这里是 Profile 的 User 字段。sso
关联外键指与外键有关联的键,被外键所引用的键。
对于属于关系,GORM 一般使用全部者的主键做为关联外键,例如,它是用户的ID。
将配置文件分配给用户时,GORM 会将用户 ID 保存到配置文件的 UserID 字段中。
您能够使用标记 association_foreignkey 更改它,例如:
type User struct { gorm.Model Refer int Name string } type Profile struct { gorm.Model Name string User User `gorm:"association_foreignkey:Refer"` // use Refer as association foreign key UserRefer string }
users 表的 refer 字段成为关联外键,Profile 的外键变成 User + Refer = UserRefer。
p1 := &Profile{ User: User{ Name: "swt", }, Name: "swt swt", } db.Create(p1)
当 p1 的 User 字段不为空时,db.Create(p1) 调用在 profiles 表中建立 p1 记录前,会先在 users 表中建立 p1.User 记录。以后 p1 及 p1.User 各个字段都被填上正确的值。
u1 := &User{Name: "swt"} db.Create(u2) p1 := &Profile{UserId: u1.ID, Name: "swt swt"} db.Create(p1)
当 p1 的 User 字段为空时,db.Create(p1) 调用在 profiles 表中建立 p1 记录前,不会先建立 user 了。
你能够用 Related 方法查找 belongs to 关联
var profile Profile user := &User{ ID: 111 } db.Model(&user).Related(&profile) // SELECT * FROM profiles WHERE user_id = 111;
将根据 user 的 ID 查找相关的 profile。