gormでJOINを使う(Golang)
今回は、gormで返り値にJoinされる方のテーブルの値は取れているが、Joinする方のテーブルの値が取れていないときのTips。 結論から言うと、JOINを使う場合にはSelect()を指定することと、変数の型に注意。
gormでJoinを使うときの注意
当初はこんな感じで記述して取れていなかった。
1commentList := []Comment{}
2db.Where("entry_id = ?", entryID).Joins("INNER JOIN accounts on accounts.id = comments.account_id").Find(&commentList)
Findで指定している変数の型がこのままではダメそうなことに気づく
ということで下記のように修正。それでもダメだった。
1type CommentJoinsAccount struct {
2 Comment
3 Account
4}
5
6commentList := []CommentJoinsAccount{}
7db.Table("comments").Joins("INNER JOIN accounts ON accounts.id = comments.account_id").Where("entry_id = ?", entryID).Order("id desc").Limit(limit).Scan(&commentList)
※ そしてScan()だとソフトデリートが自動化されないのね…『.Where(“comments.deleted_at IS NULL”)』を追加しました
ドキュメントの方ではSelectをわざわざ指定していることに気づく
[http://jinzhu.me/gorm/crud.html#joins:title]
Joinする方のテーブルのSelectを指定するのが必須だったみたい(しかもカラムも指定)。
1type CommentJoinsAccount struct {
2 Comment
3 Account
4}
5
6commentList := []CommentJoinsAccount{}
7db.Table("comments").Select("comments.*, accounts.name, accounts.icon").Joins("INNER JOIN accounts ON accounts.id = comments.account_id").Where("entry_id = ?", entryID).Order("id desc").Limit(limit).Scan(&commentList)
このとき、
1.Select("comments.*, accounts.*")