Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Pola niestandardowe w Many2Many JoinTable

Metoda 1

Z tego, co widzę w dokumentach, oto prosty sposób, w jaki możesz to zrobić:

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

Tutaj używamy rzeczywistego modelu tabeli złączeń, aby wstawić wiersz z żądanymi wartościami.

Możemy również filtrować zapytania dotyczące powiązania:

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

Metoda 2

Oto bardziej magiczny sposób, poprzez (ab)używanie Context przekazać wartości do BeforeSave hook, oprócz SetupJoinTable kod z góry:

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)

Ta metoda jest dla mnie obrzydliwa, ale działa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. VARCHAR(4) przechowuje więcej znaków niż cztery

  2. W jaki sposób podgrupy mogą mieć wygenerowaną kolumnę przyrostu dodaną w zapytaniu sql?

  3. Jak usunąć wszystkie tabele MySQL z wiersza poleceń bez uprawnień do bazy danych DROP?

  4. Czy widok MySQL jest szybszy niż zwykłe zapytanie?

  5. Uprawnienia użytkownika MySQL na współdzielonych serwerach