【问题标题】:Gorm Joins not mapping to modelsGorm Joins 未映射到模型
【发布时间】:2017-04-04 04:24:24
【问题描述】:

我正在尝试使用 sql 联接而不是 Preload() 来优化我的应用程序。 但是我遇到了一个问题,模型中的连接表总是空的。

在绝望中,我打开了一个新项目,发现了一些简单的示例代码,又遇到了同样的问题。 如果您运行下面的代码,您会看到连接的表始终是一个空数组。

我做错了吗?

import (
"fmt"
"log"

"github.com/jinzhu/gorm"
_ "github.com/lib/pq"
)

type Language struct {
    ID   uint `gorm:"primary_key"`
    Name string
}

type Movie struct {
    ID         uint `gorm:"primary_key"`
    Title      string
    Language   Language
    LanguageID uint
}

type Artist struct {
    ID     uint `gorm:"primary_key"`
    Name   string
    Movies []Movie `gorm:"many2many:artist_movies"`
}

func createArtists() {
    langs := []Language{{Name: "english"},
        {Name: "tamil"},
        {Name: "french"}}

    for i, _ := range langs {
        if err := db.Create(&langs[i]).Error; err != nil {
            log.Fatal(err)
        }
    }

    movies := []Movie{
        {Title: "Nayagan", Language: langs[1]},
        {Title: "Anbe sivam", Language: langs[1]},
        {Title: "3 idiots", Language: langs[2]},
        {Title: "Shamithab", Language: langs[2]},
        {Title: "Dark Knight", Language: langs[0]},
        {Title: "310 to Yuma", Language: langs[0]},
    }
    for i, _ := range movies {
        if err := db.Create(&movies[i]).Error; err != nil {
            log.Fatal(err)
        }
    }

    artists := []Artist{
        {Name: "Madhavan", Movies: []Movie{movies[1],movies[2]}},
        {Name: "Kamal Hassan", Movies: []Movie{movies[0], movies[1]}},
        {Name: "Dhanush", Movies: []Movie{movies[3]}},
        {Name: "Aamir Khan", Movies: []Movie{movies[2]}},
        {Name: "Amitabh Bachchan", Movies: []Movie{movies[3]}},
        {Name: "Christian Bale", Movies: []Movie{movies[4], movies[5]}},
        {Name: "Russell Crowe", Movies: []Movie{movies[5]}},
    }

    for i, _ := range artists {
    if err := db.Create(&artists[i]).Error; err != nil {
        log.Fatal(err)
        }
    }
}

var db *gorm.DB

func main() {
    var err error
    db, err = gorm.Open("postgres", "user=admin password=1234 dbname=test sslmode=disable")
if err != nil {
    log.Fatal(err)
}
db.AutoMigrate(new(Language), new(Movie), new(Artist))
db.LogMode(true)

createArtists()

var artists []Artist

if err = db.Joins("JOIN artist_movies on artist_movies.artist_id=artists.id").
    Joins("JOIN movies on movies.id=artist_movies.movie_id").
    Joins("JOIN languages on movies.language_id=languages.id").
    Where("languages.name=?", "tamil").
    Group("artists.id").Find(&artists).Error; err != nil {
    log.Fatal(err)
}
for _, ar := range artists {
    fmt.Println(ar.Movies)
}

artists = []Artist{}
if err = db.Joins("JOIN artist_movies on artist_movies.artist_id=artists.id").
    Joins("JOIN movies on artist_movies.movie_id=movies.id").Where("movies.title=?", "Nayagan").
    Group("artists.id").Find(&artists).Error; err != nil {
    log.Fatal(err)
}

for _, ar := range artists {
    fmt.Println(ar.Movies)
}

artists = []Artist{}

if err = db.Joins("JOIN artist_movies on artist_movies.artist_id=artists.id").
    Joins("JOIN movies on artist_movies.movie_id=movies.id").
    Where("movies.title in (?)", []string{"3 idiots", "Shamitabh", "310 to Yuma"}).
    Group("artists.id").Find(&artists).Error; err != nil {
    log.Fatal(err)
}
for _, ar := range artists {
    fmt.Println(ar.Movies)
}

}

【问题讨论】:

    标签: join go go-gorm


    【解决方案1】:

    Gorm 不会自动将数据加载到相关表中。您必须在查询中使用Preload("table")。创建具有相关字段的记录时,use associations。

    Docs

    Gorm doesn't currently support preloading with JOINS,您必须使用 SQL Builder 创建 SQL 并将生成的 rows 映射到您的结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      相关资源
      最近更新 更多