Has Many
has many
アソシエーションは別のモデルとの1対多となる関連を設定します。has one
と異なり、所有する側となるモデルは0個以上のモデルのインスタンスを保有します。
例えば、ユーザーとクレジットカードのモデルがあり、各ユーザーはクレジットカードを複数持つことができる場合は以下のようになります。
Declare
// User は複数の CreditCards を持ちます。UserID は外部キーとなります。 |
Retrieve
// 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 { |
Has ManyリレーションでのCRUD処理
Has many リレーションを使った処理の詳細については Association Mode を参照してください。
Eager Loading
GORMでは、 Preload
を使うことで、has manyリレーションの Eager Loadingを行うことができます。詳細については Preload (Eager loading) を参照してください。
Has Many での自己参照
type User struct { |
外部キー制約
constraint
タグを使用することで、 OnUpdate
, OnDelete
の制約を掛けることができます。指定した制約はGORMを使ったマイグレーション実行時に作成されます。例:
type User struct { |
削除時に Select
を使用することで、 指定した has many の関連も削除することができます。詳細については Delete with Select を参照してください。