Has Many
has many
アソシエーションは、別のモデルとの一対多の関係を確立します。has one
とは異なり、所有者はゼロ個または複数のモデルインスタンスを持つことができます。
たとえば、アプリケーションにユーザーとクレジットカードが含まれており、各ユーザーは複数のクレジットカードを持つことができる場合を考えてみましょう。
宣言
// User has many CreditCards, UserID is the foreign key |
取得
// Retrieve user list with eager loading credit cards |
外部キーのオーバーライド
has many
関係を定義するには、外部キーが存在する必要があります。デフォルトの外部キー名は、所有者の型名とその主キーフィールドの名前を組み合わせたものです。
たとえば、User
に属するモデルを定義する場合、外部キーはUserID
になります。
別のフィールドを外部キーとして使用するには、foreignKey
タグを使用してカスタマイズできます。例:
type User struct { |
参照のオーバーライド
GORMは通常、所有者の主キーを外部キーの値として使用します。上記の例では、User
のID
です。
ユーザーにクレジットカードを割り当てると、GORMはユーザーのID
をクレジットカードのUserID
フィールドに保存します。
references
タグを使用して変更できます。例:
type User struct { |
ポリモーフィックアソシエーション
GORMはhas one
とhas many
のポリモーフィックアソシエーションをサポートしています。所有エンティティのテーブル名がポリモーフィック型のフィールドに、主キー値がポリモーフィックフィールドに保存されます。
type Dog struct { |
polymorphicValue
タグを使用してポリモーフィック型の値を変更できます。例:
type Dog struct { |
Has Manyを使用したCRUD
Has Many関係の操作については、アソシエーションモードを参照してください。
Eager Loading
GORMはPreload
を使用してHas ManyアソシエーションのEager Loadingを許可します。詳細はプリロード(Eager Loading)を参照してください。
自己参照Has Many
type User struct { |
外部キー制約
constraint
タグを使用してOnUpdate
、OnDelete
制約を設定できます。GORMでマイグレーションする際に作成されます。例:
type User struct { |
削除時にSelect
を使用して選択したHas Manyアソシエーションを削除することもできます。詳細はSelectを使用した削除を参照してください。