Your Question
How to get the additional info from the ManyToMany JoinTable?
case: user - language (Many-to-Many)
like: ( there is a column named "Level" in JoinTable to describe somebody's language skill )
User Language
┌────┬──────┐ ┌────┬─────────┐
│ ID │ Name │ │ ID │ Name │
├────┼──────┤ ├────┼─────────┤
│ 1 │ Amy │ │ 1 │ Chinese │
├────┼──────┤ ├────┼─────────┤
│ 2 │ Bob │ │ 2 │ English │
├────┼──────┤ ├────┼─────────┤
│ 3 │ Tom │ │ 3 │ French │
└────┴──────┘ └────┴─────────┘
UserLanguage
┌────┬────────┬────────────┬────────────────┐
│ ID │ UserID │ LanguageID │ Level │
├────┼────────┼────────────┼────────────────┤
│ 1 │ 1 │ 1 │ Newbie │ // Amy can speak Chinese
├────┼────────┼────────────┼────────────────┤
│ 2 │ 1 │ 2 │ Mother Tongue │ // Amy can speak English
├────┼────────┼────────────┼────────────────┤
│ 3 │ 2 │ 2 │ Native Speaker │ // Bob can speak English
└────┴────────┴────────────┴────────────────┘
My codes:
// Models
type User struct {
ID int64 `json:"id" gorm:"primaryKey;autoIncrement"`
Name string `json:"name"`
Languages []Language `json:"languages" gorm:"many2many:user_language"`
}
func (User) TableName() string {
return "user"
}
type Language struct {
ID int64 `json:"id" gorm:"primaryKey;autoIncrement"`
Name string `json:"name"`
Level string `json:"level"`
}
func (Language) TableName() string {
return "language"
}
type UserLanguage struct {
ID int64 `json:"id" gorm:"primaryKey;autoIncrement"`
UserId int64 `json:"user_id"`
LanguageId int `json:"language_id"`
Level string `json:"level"`
}
func (UserLanguage) TableName() string {
return "user_language"
}
// Query
user := User{ID: 1}
DB.Preload("Languages").First(&user)
fmt.Println(user)
What I got:
{1 Amy [] [{1 Chinese } {2 English }]}
or in JSON format:
{
"id":1,
"name":"Amy",
"languages":[
{
"id":1,
"name":"Chinese",
"level":"" // empty string
},
{
"id":2,
"name":"English",
"level":"" // empty string
}
]
}
The document you expected this should be explained
https://gorm.io/zh_CN/docs/many_to_many.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E8%BF%9E%E6%8E%A5%E8%A1%A8
Expected answer
There are something in "level" ```json { "id":1, "name":"Amy", "languages":[ { "id":1, "name":"Chinese", "level":"Newbie" // Expected }, { "id":2, "name":"English", "level":"Mother Tongue" // Expected } ] }
Comment From: github-actions[bot]
This issue has been automatically marked as stale because it has been open 360 days with no activity. Remove stale label or comment or this will be closed in 180 days