【golang】gormによるjoinによるデータの取得
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にデータが入りますので、こちらをリターン等をして利用します。