🐈
gorm many to manyの扱い
リレーションの基本的なManyToManyをGormだとどう扱うのかをメモ
商品テーブルとその商品カテゴリーテーブルでのやり方で実装します。
前提として、商品は複数のカテゴリーを持つ、カテゴリーは複数の商品に紐づき、
item_categories
が結合テーブルになります
サンプルは記事用にシンプルな構成にしてます。
type Item struct {
ID uint `gorm:"primaryKey"`
Name string `form:"name"`
Categories []Category `gorm:"many2many:item_categories;"`
}
type Items []Item
type Category struct {
ID uint `gorm:"primaryKey"`
Name string `form:"name"`
}
type Categories []Category
type ItemCategories struct {
ID uint `gorm:"primaryKey"`
ItemID uint `gorm:"item_id"`
CategoryID uint `gorm:"category_id"`
}
必要ななのはこれ
`gorm:"many2many:item_categories;"`
これで普通にhasManyのようなやり方でView側でも表示できる。
例
{{range .item}}
{{range .Categories}}
{{.Name}}
{{end}}
{{end}}
ちなみにManyToManyでの自己結合(self join)もできる。
type User struct {
gorm.Model
Friends []*User `gorm:"many2many:user_friends"`
}
// Which creates join table: user_friends
// foreign key: user_id, reference: users.id
// foreign key: friend_id, reference: users.id
Gorm公式
Discussion