Mysql
 sql >> база данни >  >> RDS >> Mysql

Персонализирани полета в Many2Many JoinTable

Метод 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 за предаване на стойности към 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)

Този метод ми се струва неприятен, но работи.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Получете резултат, като сравните две таблици с една и съща колона

  2. SQL съвпадение при подреждане на букви и цифри без използване на регулярни изрази

  3. Дизайн на база данни:1 таблица или 2?

  4. Мигрирайте mySQL към Firebase

  5. Как да надстроите от старите пароли MySQL към нова система за пароли