场景
A(父结构体:Person):姓名
B(子结构体:Hobby):兴趣
当查询 B 表中的兴趣
时,返回的内容为(姓名,兴趣)这个用户的全部相关信息。
疑问
- 应该如何操作关联查询?
A
结构体中存在*gorm.Model
,B
结构体中是否也需要嵌入*gorm.Model
作为表的主键
Code
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
表中的字段,那么得出的两张表没有关联吧。
请指点~如果能有demo就更加感谢啦
有疑问加站长微信联系(非本文作者)
真棒,豁然开朗~ 谢谢指点