Has One
has one は、別のモデルと一対一となる関連を設定します。関連するモデルによって、セマンティクス(と因果関係)は多少異なります。 このアソシエーションは、モデルの各インスタンスが別のモデルの1つのインスタンスを含んでいるか、または所有していることを示します。
例えば、ユーザーとクレジットカードのモデルがあり、各ユーザーはクレジットカードを1枚しか持つことができないとします。
宣言
// User has one CreditCard, UserID is the foreign key  | 
取得
// Retrieve user list with eager loading credit card  | 
外部キーのデフォルト設定を上書きする
has oneを定義する場合、外部キーフィールドも存在する必要があります。所有側のモデルは、この属するモデルの主キーをこのフィールドへ保存します。
そのフィールドの名前は通常、 has oneを持つモデルの型名にprimary keyを足したものとして作成されます。上記の例では UserIDです。
ユーザーにクレジットカードを渡すと、ユーザーの ID が UserID フィールドに保存されます。
別のフィールドを使用したい場合は、foreignKeyタグで変更できます。例:
type User struct {  | 
参照フィールドのデフォルト設定を上書きする
デフォルトでは, 所有されているエンティティは has oneモデルの主キーを外部キーとして保持します。以下のNameの例のように別のフィールドを保持するように変更することもできます。
references タグを設定することで、対象となるフィールドを変更することができます。
type User struct {  | 
Has OneリレーションでのCRUD処理
Has one リレーションを使った処理の詳細については Association Mode を参照してください。
Eager Loading
GORMでは、 Preload または Joins を使うことで、has one リレーションの Eager Loadingを行うことができます。詳細については Preload (Eager loading) を参照してください。
Has One での自己参照
type User struct {  | 
外部キー制約
constraint タグを使用することで、 OnUpdate, OnDelete の制約を掛けることができます。指定した制約はGORMを使ったマイグレーション実行時に作成されます。例:
type User struct {  | 
削除時に Select を使用することで、 指定した has one の関連も削除することができます。詳細については Delete with Select を参照してください。