🐈

gorm many to manyの扱い

2021/12/30に公開

リレーションの基本的な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公式
https://gorm.io/ja_JP/docs/many_to_many.html

Discussion