【问题标题】:Associated belongs with qor admin关联属于 qor admin
【发布时间】:2019-01-17 17:32:56
【问题描述】:

我有这两种结构:

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

关键是我不知道我是否应该做其他事情来允许 Collection 和 Environemt 之间的成员关系是一对多的。问题是管理视图上的表单看起来不错,我可以添加尽可能多的环境...但是提交表单只有Collection 保存在数据库中

【问题讨论】:

  • 您是否在两个模型之间设置了任何关系? godoc.org/github.com/jinzhu/gorm#Relationship
  • 嗨@apxp 我正在尝试这样做:db.Model(&Collection).Related(&Environment)。我尝试使用 Collection 和 Environments 的结构作为参数,但这些函数是面向实例的。 我不知道在哪里做,因为表单的处理是由 qor 内部管理的。有没有办法在 Collection 的负载上添加中间件(或其他东西)??

标签: go qor


【解决方案1】:

缺少的是告诉gorm另一个模型的外键。

在您的情况下,我们使用Has Many (gorm Doc)。要定义关系,您必须在结构中添加标签:

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 无法匹配这两个模型。由于主键的conventionID,而您的Enviroment 没有该字段,因此无法匹配某些内容。请务必阅读有关conventions 的文档。

【讨论】:

  • 再次嗨@apxp 似乎开始工作了......但我发现了一对新问题:1)管理员不允许编辑EnvironmentID(这是必需的)。解决方案:Environments []Environment `gorm:"foreignkey:ID"`。 2)这个解决方案产生了一个新问题:只有最后一个环境被保存在数据库中,试图添加一个新的,最后一个编辑以前的,而不是插入一个新的环境。 3)我尝试这样做(在 env 结构上):ID uint `gorm:"primary_key" sql:"AUTO_INCREMENT"` 但添加的不仅仅是我得到的 env:pq:重复键违反唯一性限制«environments_pkey»
【解决方案2】:

我终于找到了解决办法。

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
}

在 Environment 结构上添加 CollectionID int 就足够了......所以很简单:D。

谢谢@apxp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2016-03-29
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多