У меня есть эти две структуры:
type Collection struct {
gorm.Model
APIKey string
CollectionID string
Name string
Environments []Environment
}
type Environment struct {
gorm.Model
EnvironmentID string
Name string
Provider string
FlightType string
ADT int
CHD int
INF int
}
А главное выглядит так:
func main() {
adminResource := admin.New(&admin.AdminConfig{DB: model.DB})
adminResource.AddResource(&model.Collection{})
adminResource.AddResource(&model.Environment{})
mux := http.NewServeMux()
adminResource.MountTo("/admin", mux)
if err := http.ListenAndServe(":8000", mux); err != nil {
panic(err)
} else {
fmt.Println("Listening on: 8000")
}
}
Дело в том, что я не знаю, следует ли мне делать что-то еще, чтобы разрешить отношения членства «один ко многим» между Коллекцией и Environemt. Дело в том, что форма в панели администратора выглядит хорошо, я могу добавить столько сред, сколько было ... но отправив форму только Collection
сохраняются в базе данных.
Привет @apxp, я пытался это сделать: db.Model(&Collection).Related(&Environment)
. Я пытался использовать в качестве аргументов структуры Collection и Environments, но эти функции ориентированы на экземпляр. И Я не знаю где это сделать, потому что обработкой форм управляет qor. Есть ли способ добавить промежуточное ПО (или что-то еще) в загрузку Коллекции ??
Не хватает того, чтобы сообщить gorm внешний ключ другой модели.
В вашем случае мы используем Есть много (Горм Док). Чтобы определить отношения, вам нужно добавить тег в свою структуру:
type Collection struct {
gorm.Model
APIKey string
CollectionID string
Name string
Environments []Environment `gorm:"foreignkey:EnvironmentID"`
}
type Environment struct {
gorm.Model
EnvironmentID string
Name string
Provider string
FlightType string
ADT int
CHD int
INF int
}
Без определения внешнего ключа другой модели gorm не может сопоставить эти обе модели. Поскольку соглашение для первичного ключа - это ID
, а ваш Enviroment
не имеет этого поля, сопоставить что-либо невозможно. Обязательно прочтите документацию по условности.
Еще раз привет @apxp Похоже, начинает работать ... но я обнаружил пару новых проблем: 1) Администратор не позволяет редактировать EnvironmentID (а это необходимо). Решение: Environments []Environment `gorm:"foreignkey:ID"`
. 2) Это решение создает новую проблему: в БД сохраняется только последняя среда, при попытке добавить новую, последняя редактирует предыдущую, вместо этого вставляет новую среду. 3) Я пытаюсь сделать это (в структуре env): ID uint `gorm:"primary_key" sql:"AUTO_INCREMENT"`
Но добавляя больше, чем env, я получаю: pq: дублирующийся ключ нарушает ограничение уникальности «environment_pkey»
Наконец я нашел решение.
type Collection struct {
gorm.Model
APIKey string
CollectionID string
Name string
Environments []Environment
}
type Environment struct {
gorm.Model
EnvironmentID string
Name string
Provider string
FlightType string
ADT int
CHD int
INF int
CollectionID int
}
Достаточно добавить CollectionID int
в структуру Environment ... очень просто: D.
Спасибо @apxp
Вы установили какие-либо отношения между вашими двумя моделями? godoc.org/github.com/jinzhu/gorm#Relationship