请教下Grom关联查询

infoBrainSys · 2023-02-11 22:11:54 · 1382 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-02-11 22:11:54 的主题,其中的信息可能已经有所发展或是发生改变。

场景

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表中的字段,那么得出的两张表没有关联吧。 mysql

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


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1382 次点击  
加入收藏 微博
2 回复  |  直到 2023-02-12 16:09:08
xwszt
xwszt · #1 · 2年之前
type Person struct {
    gorm.Model
    Name string // 姓名

    Hobbies []Hobby `gorm:"many2many"`
}

type Hobby struct {
    gorm.Model

    Desc string // 兴趣描述

    Persons []Person `gorm:"many2many"`
}
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)
}
infoBrainSys
infoBrainSys · #2 · 2年之前
xwsztxwszt #1 回复

```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) } ```

真棒,豁然开朗~ 谢谢指点

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传