Kmszk with GO

PHPとかJavascriptとかGolangとかVim関連とか書きそうな感じがしていたが、現状Golangだらけになっている。

gormでJOINを使う(Golang)

今回は、gormで返り値にJoinされる方のテーブルの値は取れているが、Joinする方のテーブルの値が取れていないときのTips。 結論から言うと、JOINを使う場合にはSelect()を指定することと、変数の型に注意。

gormでJoinを使うときの注意

当初はこんな感じで記述して取れていなかった。

commentList := []Comment{}
db.Where("entry_id = ?", entryID).Joins("INNER JOIN accounts on accounts.id = comments.account_id").Find(&commentList)

Findで指定している変数の型がこのままではダメそうなことに気づく

ということで下記のように修正。それでもダメだった。

type CommentJoinsAccount struct {
    Comment
    Account
}

commentList := []CommentJoinsAccount{}
db.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をわざわざ指定していることに気づく

CRUD: Reading and Writing Data · GORM Guide
Joinする方のテーブルのSelectを指定するのが必須だったみたい(しかもカラムも指定)。

type CommentJoinsAccount struct {
    Comment
    Account
}

commentList := []CommentJoinsAccount{}
db.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)

このとき、

.Select("comments.*, accounts.*")

でもダメみたいです。 なかなかにハマりました。