HasOne
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
モデルの型とその主キーを使用して生成されます。上記の例では、UserID
です。
ユーザーにクレジットカードを付与すると、ユーザーのID
がそのUserID
フィールドに保存されます。
関係の保存に別のフィールドを使用したい場合は、タグforeignKey
を使用して変更できます。例:
type User struct { |
参照の上書き
デフォルトでは、所有エンティティはhas one
モデルの主キーを外部キーに保存します。下記の例のように、別のフィールドの値を保存するように変更できます。
タグreferences
を使用して変更できます。例:
type User struct { |
ポリモーフィックアソシエーション
GORMはhas one
とhas many
のポリモーフィックアソシエーションをサポートしています。所有エンティティのテーブル名がポリモーフィック型のフィールドに、主キーがポリモーフィックフィールドに保存されます。
type Cat struct { |
タグpolymorphicValue
を使用してポリモーフィック型の値を変更できます。例:
type Dog struct { |
HasOneを使用したCRUD
has one
関係の操作については、アソシエーションモードをご覧ください。
早期読み込み
GORMでは、Preload
またはJoins
を使用してhas one
アソシエーションの早期読み込みが可能です。詳細はプリロード(早期読み込み)を参照してください。
自己参照HasOne
type User struct { |
外部キー制約
タグconstraint
を使用してOnUpdate
、OnDelete
制約を設定できます。GORMでマイグレーションする際に作成されます。例:
type User struct { |
削除時にSelect
を使用して選択されたHasOneアソシエーションを削除することもできます。詳細はSelectを使用した削除をご覧ください。