sql >> Database >  >> RDS >> Mysql

Aangepaste velden in Many2Many JoinTable

Methode 1

Van wat ik kan zien in de documenten, is dit een duidelijke manier waarop je dit momenteel zou kunnen doen:

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,
})

Hier gebruiken we het werkelijke join-tabelmodel om een ​​rij in te voegen met de waarden die we willen.

We kunnen ook zoekopdrachten voor de associatie filteren:

addr := Address{}
// Query association with filters on join table
DB.Where("person_addresses.home = true").
    Model(&person).
    Association("Addresses").
    Find(&addr)

Methode 2

Hier is een meer magische manier, door (ab)gebruik te maken van de Context waarden doorgeven aan een BeforeSave hook, naast de SetupJoinTable code van bovenaf:

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)

Deze methode voelt voor mij icky, maar het werkt.



  1. MySQL FULLTEXT zoeken

  2. MySQL Ubuntu 14.04 LTS volledig verwijderen

  3. Beter om zero-date '0000-00-00 00:00:00' of NULL te gebruiken in MySQL?

  4. Hoe voeg ik een voorloopnul toe aan verschillende tekenlengtes in mysql?