アソシエーションの自動作成/更新
GORMはレコードの作成・更新時にUpsertを使用して自動的に関連データとその参照を保存します。
user := User{ |
すでに存在するアソシエーションレコードを更新したい場合は、 FullSaveAssociations
を使用してください。
db.Session(&gorm.Session{FullSaveAssociations: true}).Updates(&user) |
アソシエーションの自動作成/更新をスキップ
作成/更新時のアソシエーションレコードの自動保存をスキップするには、 Select
または Omit
を使用します。例:
user := User{ |
注意: many2many(多対多)のアソシエーションの場合、中間テーブルのレコードを作成するより前に、アソシエーション先テーブルのレコードをupsertします。アソシエーション先へのupsertを省略したい場合は、以下のように記載します。
db.Omit("Languages.*").Create(&user)次のコードはアソシエーション先のレコードの作成と中間テーブルでの参照の作成の両方をスキップします。
db.Omit("Languages").Create(&user)
アソシエーションフィールドの選択/省略
user := User{ |
Association Mode
Association Mode には、データの関連を処理するためによく使用されるヘルパーメソッドが含まれています。
// Start Association Mode |
関連の取得
関連レコードを取得することができます。
db.Model(&user).Association("Languages").Find(&languages) |
条件を指定して関連を取得することも可能です。
codes := []string{"zh-CN", "en-US", "ja-JP"} |
関連の追加
many to many
や has many
の場合には関連を追加し、 has one
や belongs to
の場合には現在の関連を置き換えます。
db.Model(&user).Association("Languages").Append([]Language{languageZH, languageEN}) |
関連を置き換える
現在の関連を新しいもので置き換えることができます。
db.Model(&user).Association("Languages").Replace([]Language{languageZH, languageEN}) |
関連を削除する
引数で指定された値との関連がある場合、その値との関連を削除します。削除されるのは参照のみであり、参照先オブジェクトのレコードはDBから削除されません。
db.Model(&user).Association("Languages").Delete([]Language{languageZH, languageEN}) |
関連を全て削除する
関連データとの参照を全て削除することができます。削除されるのは参照のみであり、参照先のレコードは削除されません。
db.Model(&user).Association("Languages").Clear() |
関連の数を取得する
現在の関連の数を取得することができます。
db.Model(&user).Association("Languages").Count() |
一括データ処理
Association Mode はデータの一括処理もサポートしています。例:
// 全てのユーザの役割を全て取得する |
Delete Association Record
By default, Replace
/Delete
/Clear
in gorm.Association
only delete the reference, that is, set old associations’s foreign key to null.
You can delete those objects with Unscoped
(it has nothing to do with ManyToMany
).
How to delete is decided by gorm.DB
.
// Soft delete |
Delete with Select
You are allowed to delete selected has one/has many/many2many relations with Select
when deleting records, for example:
// delete user's account when deleting user |
NOTE: Associations will only be deleted if the deleting records’s primary key is not zero, GORM will use those primary keys as conditions to delete selected associations
// DOESN'T WORK
db.Select("Account").Where("name = ?", "jinzhu").Delete(&User{})
// will delete all user with name `jinzhu`, but those user's account won't be deleted
db.Select("Account").Where("name = ?", "jinzhu").Delete(&User{ID: 1})
// will delete the user with name = `jinzhu` and id = `1`, and user `1`'s account will be deleted
db.Select("Account").Delete(&User{ID: 1})
// will delete the user with id = `1`, and user `1`'s account will be deleted
タグ | 説明 |
---|---|
foreignKey | テーブル結合時に、これを指定したモデルの外部キーとして使用するフィールド名を指定できます |
references | テーブル結合時に、参照先テーブルの外部キーとして使用するフィールド名を指定できます |
polymorphic | モデル名などのポリモーフィック関連の種別を指定できます |
polymorphicValue | ポリモーフィック関連ので使用される値を指定できます。デフォルトはテーブル名です。 |
many2many | 結合テーブル名を指摘できます |
joinForeignKey | テーブル結合時に、これを指定したモデルの外部キーとして使用する結合テーブルのカラム名を指定できます |
joinReferences | テーブル結合時に、参照先テーブルの外部キーとして使用する結合テーブルのカラム名を指定できます |
constraint | 参照制約を指定できます。例:OnUpdate , OnDelete |