请教下Grom关联查询

场景

A(父结构体:Person):姓名
B(子结构体:Hobby):兴趣
当查询 B 表中的兴趣时,返回的内容为(姓名,兴趣)这个用户的全部相关信息。

疑问

  • 应该如何操作关联查询?
  • A结构体中存在*gorm.ModelB 结构体中是否也需要嵌入*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表中的字段,那么得出的两张表没有关联吧。
    请教下Grom关联查询

请指点~如果能有demo就更加感谢啦

最佳答案

grom 关联查询可以参考以下写法,具体使用请查看gorm官方文档 gorm.io/zh_CN/docs/query.html

personList:=make([]*Person,0)
db =db.Model(Hobby)
db.Joins("inner join persion p on p.name=hobby.name")
db.Where("hobby.code",?)
db.Find(&personList)
2年前 评论
讨论数量: 1

grom 关联查询可以参考以下写法,具体使用请查看gorm官方文档 gorm.io/zh_CN/docs/query.html

personList:=make([]*Person,0)
db =db.Model(Hobby)
db.Joins("inner join persion p on p.name=hobby.name")
db.Where("hobby.code",?)
db.Find(&personList)
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!