Auto Create/Update
GORM はレコードの作成・更新時に関連および関連先を自動的に保存します。もし関連に主キーが含まれる場合、GORM は関連先の Update
を保存時にコールし、そうでなければ作成します。
user := User{ |
Skip AutoUpdate
関連がすでにデータベースに存在する場合、更新したくないでしょう。
そのような場合は gorm:association_autoupdate
を false
に設定することができます。
// 主キーがあっても関連を更新しませんが、参照は保存します |
あるいは gorm:"association_autoupdate:false"
タグを使用します。
type User struct { |
Skip AutoCreate
自動更新を無効にしたとしても、主キーを除く関連付けは作成され、その参照も保存されます。
これを無効にするには、DB設定のgorm:association_autocreateをfalseに設定します
// 主キーがあっても関連を更新しませんが、参照は保存します |
または、GORMタグのgorm:”association_autocreate:false”を使用します。
type User struct {
gorm.Model
Name string
// Don't create associations w/o primary key, WON'T save its reference
Company1 Company `gorm:"association_autocreate:false"`
}
Skip AutoCreate/Update
AutoCreate
とAutUpdate
の両方を無効にしたい場合には、両方の設定をfalse
にします。
db.Set("gorm:association_autoupdate", false).Set("gorm:association_autocreate", false).Create(&user) |
もしくは、gorm:save_associations
タグを使用します。
db.Set("gorm:save_associations", false).Create(&user)
db.Set("gorm:save_associations", false).Save(&user)
type User struct {
gorm.Model
Name string
Company Company `gorm:"save_associations:false"`
}
Skip Save Reference
If you don’t even want to save association’s reference when updating/saving data, you could use below tricks
db.Set("gorm:association_save_reference", false).Save(&user) |
or use tag
type User struct { |
Association Mode
Associationモードには、リレーションを簡単に操作するためのいくつかのヘルパーメソッドがあります。
// Associationモードを開始します |
Find Associations
条件に当てはまるassciationを見つけます。
db.Model(&user).Association("Languages").Find(&languages) |
Append Associations
many to many
, has many
の場合、新しいassociationを追加し、has one
, belongs to
の場合、現在のassociationと置き換えます。
db.Model(&user).Association("Languages").Append([]Language{languageZH, languageEN}) |
Replace Associations
現在のassociationを、新しいものと置き換えます。
db.Model(&user).Association("Languages").Replace([]Language{languageZH, languageEN}) |
Delete Associations
Remove relationship between source & argument objects, only delete the reference, won’t delete those objects from DB.
db.Model(&user).Association("Languages").Delete([]Language{languageZH, languageEN}) |
Clear Associations
Remove reference between source & current associations, won’t delete those associations
db.Model(&user).Association("Languages").Clear() |
Count Associations
現在のassociation数を数えて返します。
db.Model(&user).Association("Languages").Count() |