Belongs To

Belongs To

belongs toアソシエーションは、モデルの各インスタンスが他のモデルの1つのインスタンスに “属する “ように、他のモデルとの1対1の接続を設定します。

たとえばユーザと会社が存在するアプリケーションがあり、各ユーザは1つの会社に所属する場合、以下のモデル定義はその関係性を表します。 ここで注意が必要なのは、 User オブジェクトには、 CompanyIDCompany の両方がある点です。 デフォルトでは、 CompanyIDUserCompany 間の外部キーを使った関連の作成に暗黙的に使われます。従って、Company の情報を埋めるためにCompanyID は User に含まれる必要があります。

// `User`は`Company`に属します。 `CompanyID`は外部キーです。
type User struct {
gorm.Model
Name string
CompanyID int
Company Company
}

type Company struct {
ID int
Name string
}

構造体内部にある別の構造体の読み込みの詳細については、 Eager Loading を参照してください。

外部キーのデフォルト設定を上書きする

Belongs to リレーションを定義するには、外部キーが存在する必要があります。デフォルトの外部キーでは、所有する側にあるモデルの型名とそのモデルの主キーのフィールド名を使用します。

上記の例では、Company に属する User モデルを定義する際、規約に従い、外部キーを CompanyID としています。

GORMは外部キーをカスタマイズする方法を提供しています。例:

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は通常、所有する側にあるモデルの主キーをリレーションの外部キーの値として使用します。 上記の例では CompanyID がそれに該当します。

UserをCompanyに割り当てた場合、GORMはCompanyの ID をUserの CompanyIDフィールドに保存します。

references タグを設定することで、対象となるフィールドを変更することができます。

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処理

Belongs toリレーションを使った処理の詳細については Association Mode を参照してください。

Eager Loading

GORMでは、 Preload または Joins を使うことで、belongs toリレーションの Eager Loadingを行うことができます。詳細については Preload (Eager loading) を参照してください。

外部キー制約

constraint タグを使用することで、 OnUpdate, OnDelete の制約を掛けることができます。指定した制約はGORMを使ったマイグレーション実行時に作成されます。例:

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
}

Gold Sponsors

Become a Sponsor!

Gold Sponsors

Become a Sponsor!