今回は、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)
※ Find()でテーブル指定していたのをScan()に変更したので、Table()を追加。
※ そして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.*")
でもダメみたいです。