विधि 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)
यह तरीका मुझे मुश्किल लगता है, लेकिन यह काम करता है।