### 场景
A(父结构体:Person):姓名
B(子结构体:Hobby):兴趣
当查询 B 表中的`兴趣`时,返回的内容为(姓名,兴趣)这个用户的全部相关信息。
### 疑问
- 应该如何操作关联查询?
- `A`结构体中存在`*gorm.Model`,`B` 结构体中是否也需要嵌入`*gorm.Model`作为表的主键
### Code
```go
package main
import (
"Learn/db"
"database/sql/driver"
"encoding/json"
"errors"
"fmt"
"gorm.io/gorm"
)
// 定义数据类型
type Notes []string
func (n Notes) Save(value interface{}) error {
str, ok := value.([]byte)
if !ok {
return errors.New("value type not match")
}
json.Unmarshal(str, &n)
return nil
}
func (n Notes) Value() (driver.Value, error) {
str, err := json.Marshal(&n)
if err != nil {
return nil, err
}
return string(str), nil
}
// 定义人相关的结构体
type Person struct {
*gorm.Model
Name string `gorm:"column:name"`
}
func (p Person) TableName() string {
return "person"
}
// 定义爱好结构体
type Hobby struct {
*Person
Code Notes `gorm:"column:code"`
}
func (b Hobby) TableName() string {
return "hobby"
}
func main() {
db, err := db.InitDB()
if err != nil {
fmt.Println("conn db err: ", err)
}
db.AutoMigrate(&Person{}, &Hobby{})
var hobby Hobby = Hobby{
Code: Notes{"golang", "python"},
}
var person Person = Person{
Name: "tom",
}
tx := db.Create(&hobby).RowsAffected
tc := db.Create(&person).RowsAffected
fmt.Println("affected rows: ", tx, tc)
}
```
### 结果
- 表映射创建虽然没有问题,但是`B`表中也存有`A`表中的字段。那如果我不将`B`表使用匿名继承`A`表中的字段,那么得出的两张表没有关联吧。
![mysql](https://static.golangjob.cn/230211/ee8446a1a4522562283cfdd2b295504d.png)
---
请指点~如果能有demo就更加感谢啦
更多评论
```go
type Person struct {
gorm.Model
Name string // 姓名
Hobbies []Hobby `gorm:"many2many"`
}
type Hobby struct {
gorm.Model
Desc string // 兴趣描述
Persons []Person `gorm:"many2many"`
}
```
```go
func TestMigrate(t *testing.T) {
db.Client().AutoMigrate(&Person{}, &Hobby{})
}
func TestAddPerson(t *testing.T) {
p := Person{
Name: "张三",
Hobbies: []Hobby{
{Desc: "玩游戏"},
{Desc: "看电影"},
{Desc: "旅游"},
},
}
db.Client().Create(&p)
}
func TestFindHobby(t *testing.T) {
var hobby Hobby
_ = db.Client().Preload("Persons").Find(&hobby)
t.Logf("%+v", hobby)
}
```
#1