Phương pháp 1
Từ những gì tôi có thể thấy trong tài liệu, đây là một cách rõ ràng mà bạn hiện có thể thực hiện việc này:
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,
})
Ở đây, chúng tôi đang sử dụng mô hình bảng nối thực tế để chèn một hàng với các giá trị mà chúng tôi muốn.
Chúng tôi cũng có thể lọc các truy vấn cho liên kết:
addr := Address{}
// Query association with filters on join table
DB.Where("person_addresses.home = true").
Model(&person).
Association("Addresses").
Find(&addr)
Phương pháp 2
Đây là một cách kỳ diệu hơn, bằng cách (ab) sử dụng Context
để chuyển các giá trị vào một BeforeSave
hook, ngoài SetupJoinTable
mã từ bên trên:
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)
Phương pháp này cảm thấy khó hiểu đối với tôi, nhưng nó hoạt động.