gorm:为关系定义有效的外键或实现 Valuer/Scanner 接口

问题描述 投票:0回答:2

我想在 gorm 中为我的模型添加一些外键。我所做的与添加外键的文档完全相同。 这些是模型

专辑型号:

type Album struct {
    gorm.Model
    Artists     []Artist
    Name        string
    ReleaseDate time.Time
    Genre       Genre
    Picture     string
}

艺人模特:

type Artist struct {
    gorm.Model
    Name        string
    Description string
    YearsActive string
}

流派模型:

type Genre struct {
    gorm.Model
    Name        string
    Description string
}

轨道型号:

type Track struct {
    gorm.Model
    Album    Album
    Name     string
    Artists  []Artist
    Playtime time.Duration
}

以及我用于创建表的代码:

DB.Debug().AutoMigrate(&models.Genre{}, &models.Artist{}, &models.Album{}, &models.Track{})

我在这里做错了什么?我对外键概念很陌生。我只想将曲目分别与他们的艺术家和专辑相关联。

go go-gorm
2个回答
3
投票

所以,问题是 gorm 不知道如何将专辑与艺术家连接起来(其他人也一样),您需要将

AlbumID
字段添加到
Artist
结构中,以便 gorm 知道结构之间的连接是什么。

这是您提供的所有结构的示例:

专辑型号:

type Album struct {
    gorm.Model
    Artists     []Artist `gorm:"many2many:album_artists;"`
    Name        string
    ReleaseDate time.Time
    GenreID     uint
    Genre       Genre
    Picture     string
}

由于专辑和艺术家是多对多的关系,您可以根据需要反向引用在这里查看

艺人模特:

type Artist struct {
    gorm.Model
    Name        string
    Description string
    YearsActive string
}

流派模型:

type Genre struct {
    gorm.Model
    Name        string
    Description string
}

轨道型号:

type Track struct {
    gorm.Model
    AlbumID  uint
    Album    Album
    Name     string
    Artists  []Artist  `gorm:"many2many:track_artists;"`  // you may back reference this too
    Playtime time.Duration
}

现在你可以使用这个:

DB.Debug().AutoMigrate(&models.Genre{}, &models.Artist{}, &models.Album{}, &models.Track{})

0
投票

检查您是否为父表和子表正确添加了 ID 或任何其他字段

primary key

© www.soinside.com 2019 - 2024. All rights reserved.