方法1
ドキュメントで確認できることから、現在これを行う可能性のあるクリーンな方法は次のとおりです。
DB.SetupJoinTable(&Person{}, "Addresses", &PersonAddress{})
addr1 := Address{Name: "addr1"}
DB.Create(&addr1)
addr2 := Address{Name: "addr2"}
DB.Create(&addr2)
person := Person{Name: "jinzhu"}
DB.Create(&person)
// Add an association with default values (i.e. Home = false)
DB.Model(&person).Association("Addresses").Append(&addr1)
// Add an association with custom values
DB.Create(&PersonAddress{
PersonID: person.ID,
AddressID: addr2.ID,
Home: true,
})
ここでは、実際の結合テーブルモデルを使用して、必要な値の行を挿入しています。
関連付けのクエリをフィルタリングすることもできます:
addr := Address{}
// Query association with filters on join table
DB.Where("person_addresses.home = true").
Model(&person).
Association("Addresses").
Find(&addr)
方法2
Context
を(ab)使用することで、より魔法のような方法があります。 BeforeSave
に値を渡す SetupJoinTable
に加えて、フック 上からのコード:
func (pa *PersonAddress) BeforeSave(tx *gorm.DB) error {
home, ok := tx.Statement.Context.Value("home").(bool)
if ok {
pa.Home = home
}
return nil
}
// ...
DB.WithContext(context.WithValue(context.Background(), "home", true)).
Model(&person).
Association("Addresses").
Append(&addr2)
この方法は私には不快に感じますが、うまくいきます。