屬於(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。