# Belongs To
## Belongs To
`belongs to` 會與另一個模型建立了一對一的連接。 這種模型的每一個實例都“屬于”另一個模型的一個實例。
例如,您的應用包含 user 和 company,并且每個 user 都可以分配給一個 company
```go
// `User` 屬于 `Company`,`CompanyID` 是外鍵
type User struct {
gorm.Model
Name string
CompanyID int
Company Company
}
type Company struct {
ID int
Name string
}
```
## 重寫外鍵
要定義一個 belongs to 關系,必須存在外鍵,默認的外鍵使用擁有者的類型名加上主字段名
對于上面例子,定義屬于 `Company` 的 `User`,其外鍵一般是 `CompanyID`
此外,GORM 還提供了一種自定義外鍵的方法,例如:
```go
type User struct {
gorm.Model
Name string
CompanyRefer int
Company Company `gorm:"foreignKey:CompanyRefer"`
// 使用 CompanyRefer 作為外鍵
}
type Company struct {
ID int
Name string
}
```
## 重寫引用
對于 belongs to 關系,GORM 通常使用擁有者的主字段作為外鍵的值。 對于上面的例子,它是 `Company` 的 `ID` 字段
當您將 user 分配給某個 company 時,GORM 會將 company 的 `ID` 保存到用戶的 `CompanyID` 字段
此外,您也可以使用標簽 `references` 手動更改它,例如:
```go
type User struct {
gorm.Model
Name string
CompanyID string
Company Company `gorm:"references:Code"` // 使用 Code 作為引用
}
type Company struct {
ID int
Code string
Name string
}
```
## Belongs to 的 CRUD
查看 [關聯模式](./associations.md#Association-Mode) 獲取 belongs to 相關的用法
## 預加載
GORM 可以通過 `Preload`、`Joins` 預加載 belongs to 關聯的記錄,查看 [預加載](./preload.md) 獲取詳情
## 外鍵約束
你可以通過標簽 `constraint` 并帶上 `OnUpdate`、`OnDelete` 實現外鍵約束,例如:
```go
type User struct {
gorm.Model
Name string
CompanyID int
Company Company `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}
type Company struct {
ID int
Name string
}
```