关联
Belongs To
属于
belongs to 关联建立一个和另一个模型的一对一连接,使得模型声明每个实例都「属于」另一个模型的一个实例 。
例如,如果你的应用包含了用户和用户资料, 并且每一个用户资料只分配给一个用户
type User struct { gorm.Model Name string } // `Profile` 属于 `User`, `UserID` 是外键 type Profile struct { gorm.Model UserID int User User Name string }
外键
为了定义从属关系, 外键是必须存在的, 默认的外键使用所有者类型名称加上其主键。
像上面的例子,为了声明一个模型属于 User,它的外键应该为 UserID。
GORM 提供了一个定制外键的方法,例如:
type User struct { gorm.Model Name string } type Profile struct { gorm.Model Name string User User `gorm:"foreignkey:UserRefer"` // 使用 UserRefer 作为外键 UserRefer string }
关联外键
对于从属关系, GORM 通常使用所有者的主键作为外键值,在上面的例子中,就是 User 的 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 作为关联外键 UserRefer string }
使用属于
你能找到 belongs to 和 Related 的关联
db.Model(&user).Related(&profile) SELECT * FROM profiles WHERE user_id = 111; // 111 is user's ID
Has One
has one 关联也是与另一个模型建立一对一的连接,但语义(和结果)有些不同。 此关联表示模型的每个实例包含或拥有另一个模型的一个实例。
例如,如果你的应用程序包含用户和信用卡,并且每个用户只能有一张信用卡。
// 用户有一个信用卡,CredtCardID 外键 type User struct { gorm.Model CreditCard CreditCard } type CreditCard struct { gorm.Model Number string UserID uint }
外键
对于一对一关系,一个外键字段也必须存在,所有者将保存主键到模型关联的字段里。
这个字段的名字通常由 belongs to model 的类型加上它的 primary key 产生的,就上面的例子而言,它就是 CreditCardID
当你给用户一个信用卡, 它将保存一个信用卡的 ID 到 CreditCardID 字段中。
如果你想使用另一个字段来保存这个关系,你可以通过使用标签 foreignkey 来改变它, 例如:
type User struct { gorm.Model CreditCard CreditCard `gorm:"foreignkey:CardRefer"` } type CreditCard struct { gorm.Model Number string UserName string }
关联外键
通常,所有者会保存 belogns to model 的主键到外键,你可以改为保存其他字段, 就像下面的例子使用 Number 。
type User struct { gorm.Model CreditCard CreditCard `gorm:"association_foreignkey:Number"` } type CreditCard struct { gorm.Model Number string UID string }
多态关联
支持多态的一对多和一对一关联。
type Cat struct { ID int Name string Toy Toy `gorm:"polymorphic:Owner;"` } type Dog struct { ID int Name string Toy Toy `gorm:"polymorphic:Owner;"` } type Toy struct { ID int Name string OwnerID int OwnerType string }
注意:多态属于和多对多是明确的不支持并将会抛出错误。
使用一对一
你可以通过 Related 找到 has one 关联。
var card CreditCard db.Model(&user).Related(&card, "CreditCard") SELECT * FROM credit_cards WHERE user_id = 123; // 123 是用户表的主键 // CreditCard 是用户表的字段名,这意味着获取用户的信用卡关系并写入变量 card。 // 像上面的例子,如果字段名和变量类型名一样,它就可以省略, 像: db.Model(&user).Related(&card)
Has Many
一对多
has many 关联就是创建和另一个模型的一对多关系, 不像 has one,所有者可以拥有0个或多个模型实例。
例如,如果你的应用包含用户和信用卡, 并且每一个用户都拥有多张信用卡。
// 用户有多张信用卡,UserID 是外键 type User struct { gorm.Model CreditCards []CreditCard } type CreditCard struct { gorm.Model Number string UserID uint }
外键
为了定义一对多关系, 外键是必须存在的,默认外键的名字是所有者类型的名字加上它的主键。
就像上面的例子,为了定义一个属于User 的模型,外键就应该为 UserID。
使用其他的字段名作为外键, 你可以通过 foreignkey 来定制它, 例如:
type User struct { gorm.Model CreditCards []CreditCard `gorm:"foreignkey:UserRefer"` } type CreditCard struct { gorm.Model Number string UserRefer uint }
外键关联
GORM 通常使用所有者的主键作为外键的值, 在上面的例子中,它就是 User 的 ID。
当你分配信用卡给一个用户, GORM 将保存用户 ID 到信用卡表的 UserID 字段中。
你能通过 association_foreignkey 来改变它, 例如:
type User struct { gorm.Model MemberNumber string CreditCards []CreditCard `gorm:"foreignkey:UserMemberNumber;association_foreignkey:MemberNumber"` } type CreditCard struct { gorm.Model Number string UserMemberNumber string }
多态关联
支持多态的一对多和一对一关联。
type Cat struct { ID int Name string Toy []Toy `gorm:"polymorphic:Owner;"` } type Dog struct { ID int Name string Toy []Toy `gorm:"polymorphic:Owner;"` } type Toy struct { ID int Name string OwnerID int OwnerType string }
注意:多态属于和多对多是明确不支持并会抛出错误的。
使用一对多
你可以通过Related 找到 has many 关联关系。
db.Model(&user).Related(&emails) SELECT * FROM emails WHERE user_id = 111; // 111 是用户表的主键
Many To Many
多对多
多对多为两个模型增加了一个中间表。
例如,如果你的应用包含用户和语言, 一个用户会说多种语言,并且很多用户会说一种特定的语言。
// 用户拥有并属于多种语言, 使用 `user_languages` 作为中间表 type User struct { gorm.Model Languages []Language `gorm:"many2many:user_languages;"` } type Language struct { gorm.Model Name string }
gorm 教程二(2)https://developer.aliyun.com/article/1391740