gorm 關係 belongs to 屬於

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

建立記錄

一塊兒建立 User 和 Profile:

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 各個字段都被填上正確的值。

分開建立 User 和 Profile:

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。

相關文章
相關標籤/搜索