我刚开始使用GORM并尝试建立“有很多关系”。我正在尝试向Previous.Holdings添加关联(我认为我正确地遵循了docs),但是当我尝试执行select * from previous时,数据库中没有任何显示。关于我所缺少的任何想法。

import (
    orm "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite"
)

type Previous struct {
    orm.Model

    Holdings []Holding `gorm:"foreignkey:ID"`
}

type Holding struct {
    ID uint `gorm:"primary_key"`

    Symbol string
    PurchaseDate time.Time
    SellDate time.Time
}

func main() {
    t1, _ := time.Parse("2006-01-02", "2017-06-16")
    h := Holding{
        Symbol: "abc",
        PurchaseDate: t1,
    }
    db.Model(&Previous{}).Association("Holdings").Append(h)
}

最佳答案

首先,您应该创建previous表。您可以通过进行迁移来实现。您可能应该在数据库连接初始化之后进行该迁移。例如

db.AutoMigrate(&Previous{})

因此,当您使用db.Model(&Previous{})时,您不会保存任何实体,并且如果您想与Holdings实体进行关联,则需要通过执行以下操作来首先对SaveFind现有Previous记录进行操作。
previous := &Previous{}
db.Save(previous)

之后,您可以像在代码中一样将保留记录追加到Model,但更改引用的Previous。所以看起来像这样
h := Holding{
    Symbol:       "abc",
    PurchaseDate: t1,
}
db.Model(previous).Association("Holdings").Append(h)

我不知道它是否用于测试,但是当您对实体建模时,您可以在不指定外键的情况下创建引用的ID,也可以将Holding ID作为ForeignKey使用,因此Previous的ID将是您的Holding的ID。

对我来说,您的模型声明应如下所示(PreviousID将自动签名为Previous的外键)
type Previous struct {
    orm.Model

    Holdings []Holding
}

type Holding struct {
    ID           uint `gorm:"primary_key"`
    PreviousID   uint
    Symbol       string
    PurchaseDate time.Time
    SellDate     time.Time
}

关于go - Golang的GORM未将关联添加到 “has many”关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49483172/

10-13 05:36