15000


例えば以下の構造体のデータベース

[code]

    type Track struct{
        ID int
        Name string
        Artist Artist
        ArtistID int
    }
    type Artist struct{
        ID int
        Name string
    }
    
[/code]

があったとして、

普通に

[code]

    var tracks []Track
    db.Find(&tracks)
    
[/code]

とすると 入れ子になっているArtistはnilになります。

このような場合tracksのArtistもまとめて取得するにはどうすればいいのでしょうか。  
例えば`track Track`というオブジェクトなら <https://github.com/jinzhu/gorm#has-one>
の方法で取得できそうですが、配列として取得する方法がわかりません。ご教授いただけないでしょうか。


CC BY-SA 3.0
2015-08-29T05:54:59.243
14991
2015-08-30T03:37:46.530
7232
question
go sql gorm
gormを使って入れ子構造のオブジェクトを配列で取得したい


gorm の has-one ではなく、単純に `select * from artists where id = tracks.artist_id;`
に相当する処理で取得するのはどうでしょうか。

[code]

    // Sample records
    var tracks = []Track{
        {
            Name: "Let's Golang !",
            Artist: Artist{
                Name: "Gopher",
            },
        },
        {
            Name: "Happy Gopher",
            Artist: Artist{
                Name: "Golang masters",
            },
        },
    }
    
    func main() {
        db, _ := gorm.Open("sqlite3", "gorm.db")
        db.CreateTable(Track{}, Artist{})
    
        // Insert
        for _, s := range tracks {
            db.Create(&s)
        }
    
        // Select
        var selected []Track
        db.Find(&selected)
    
        // SELECT * FROM artists WHERE id = tracks.artist_id;
        for i, s := range selected {
            db.Where("id = ?", s.ArtistID).Find(&selected[i].Artist)
            fmt.Printf("%#v\n", selected[i])
        }
    
        db.Close()
    }
    
[/code]

**追記**

has-one を使う方法も載せておきます(こちらの方が解り易いかもしれません)。

[code]

    for i, s := range selected {
      db.Model(&s).Related(&selected[i].Artist, "ArtistID")
      fmt.Printf("%#v\n", selected[i])
    }
    
[/code]

`"ArtistID"` は `"artist_id"`(DB テーブルのカラム名)でも問題ありません。

`Model()` で指定するテーブル(tracks)と `Related()` で指定するテーブル(artist)
とを関連付けるカラム名(`ArtistID` or `artist_id`)を指定します。ただ、前述の `Where(...).Find(...)`
と同様に 1 レコードづつ処理を行う必要があります。


CC BY-SA 3.0
2015-08-29T11:34:55.497
15000
2015-08-30T03:37:46.530
2015-08-30T03:37:46.530
14991
answer