【golang】gormによるjoinによるデータの取得

golang バックエンド


gormと言うorマッパーが優秀です。
通常のselect文はすんなりいったのですが、JOINによるデータ取得が苦戦したので備忘録を残します。

取得する構造体の作成

例えば、UserテーブルとCreditCardテーブルがある場合、Userが複数CreditCardを持っている物とします。

type User struct {
    Id int
    UserName string
    CreditCard_id int
}

type CreditCard struct {
    Id int 
    CreditCartName string
}

この場合UserとCreditCardを合算した構造体の作成が必要です。記載には2パターンあります。

パターン1 2つの構造体をインポートする。

UserCreditCardと言う新しい構造体を作成しますが、2つの構造体を記述する事で参照して定義する事ができます。

type User struct {
    Id int
    UserName string
    CreditCard_id int
}

type CreditCard struct {
    Id int 
    CreditCartName string
}

/*今回作成する構造体*/
type UserCreditCard struct {
    User
    CreditCard
}

パターン2 そのまま記述する

/*今回作成する構造体*/
type UserCreditCard struct {
    UserName string
    CreditCard_id int
    CreditCartName string
}

上記のどちらでもOKです。

作成した構造体にデータを入れる

ポイントとしてはScanに作成した構造体のポインタを指定する事で、構造体形式のデータにSQLの結果を入れる事ができます。

 
        db := dbconnect.Connect()
        defer db.Close()
        UserCreditCard := []model.UserCreditCard{}

        
        result := db.Table("users").Select(
            []string{"user.id", "user.UserName","CreditCard.CreditCardName"}).Joins(
                    "left join users on user.CreditCard_id = CreditCard.id").Scan(&UserCreditCard)
      

ですのでresultには、SQL実行ができたかできないかを確認して、実際のデータはUserCreditCardにデータが入りますので、こちらをリターン等をして利用します。