2016-11-20 6 views
1

私は、Preload()の代わりにSQL結合を使用してアプリケーションを最適化しようとしています。 しかし、私はモデルの結合されたテーブルが常に空である問題に遭遇しました。Gormはモデルへの結合を結合しません

私は新しいプロジェクトを開いていくつかの簡単なサンプルコードと同じ問題を発見しました。 以下のコードを実行すると、結合テーブルは常に空の配列になります。

私は何か間違っていますか?

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

}

答えて

0

ゴームが自動的に関連するテーブルにデータをロードしません。クエリにはPreload("table")を使用する必要があります。関連フィールドを持つレコードを作成するときは、use associations

Docs

ゴームdoesn't currently support preloading with JOINS、あなたはSQL BuilderでSQLを作成し、構造体に結果rowsをマップする必要があります。

関連する問題