GORM使用外键创建记录

cgvd09ve  于 2023-02-17  发布在  Go
关注(0)|答案(1)|浏览(154)

无法创建引用现有行的记录。
我有两个表和一个表引用在另一个。表“类别”已经存在。我试图添加新的记录在“遗产”表,但戈姆试图做新的记录在类别。

type Category struct {
    gorm.Model
    Name string `gorm:"unique"`
}

type Site struct {
    gorm.Model
    Category         Category `gorm:"foreignkey:CategoryID"`
    DateInscribed    string
    HttpURL          string
    Latitude         float32
    Location         string
    Longitude        float32
    SecondaryDates   string
    ShortDescription string
    Site             string
}

正如我所说,“类别”表存在所有我需要的行。我试图做网站记录,但得到问题“定义一个有效的外键的关系或实现值/扫描器接口”。
用这个代码我尝试做记录。

site := &models.Site{
    Category:         models.Category{Name: heritage.Category},
    DateInscribed:    heritage.DateInscribed,
    HttpURL:          heritage.HttpURL,
    Latitude:         heritage.Latitude,
    Location:         heritage.Location,
    Longitude:        heritage.Longitude,
    SecondaryDates:   heritage.SecondaryDates,
    ShortDescription: heritage.ShortDescription,
}

db.Create(site)

似乎我试图在类别表上创建新记录,但只需要将category_id值添加到站点记录中。

nkcskrwz

nkcskrwz1#

通常你不会把Name存储为外键,而是把ID值存储为外键。为此,你需要在Site中添加一个新字段CategoryID,类型为uint

type Site struct {
    gorm.Model
    Category         Category
    CategoryID       uint
    DateInscribed    string
    ...
}

该字段将自动链接到Category表,因此如果使用默认名称,则不需要写入gorm:"foreignKey:CategoryID"
然后,要创建Site对象,可以按以下方式执行操作:

site := &models.Site{
    CategoryID: id,
    DateInscribed:    heritage.DateInscribed,
    ...
}
db.Create(site)

如果你想重用现有的表Category,你需要从name中找到ID:

var id uint
db.Model(&models.Category{}).Where("name = ?", name).Select("ID").First(&id)

对于我来说,如果您想引用Name字段,GORM文档中并不清楚该怎么做,也许其他人可以回答。
希望这个有用。

相关问题