gorm-hasmany创建及查询

hasmany

创建表并插入数据
package main
import (
  "fmt"
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

type Card struct {
  ID     uint
  UserID uint
  Name   string
}
type User struct {
  ID    uint
  Name  string
  Cards []Card
}

func main() {

  dsn := "root:He200203@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"

  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  if err != nil {
      fmt.Println("err", err)
  }
  c1 := Card{
      Name: "card1",
  }
  c2 := Card{
      Name: "card2",
  }
  u1 := User{
      Name: "user1",
      Cards: []Card{
          c1, c2,
      },
  }
  db.AutoMigrate(&User{}, &Card{})
  db.Create(&u1)
}
查询操作
package main

import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

type Card struct {
    ID     uint
    UserID uint
    Name   string
}
type User struct {
    ID    uint
    Name  string
    Cards []Card
}

func main() {

    dsn := "root:He200203@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"

    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        fmt.Println("err", err)
    }
    var uu User
    db.Preload("Cards").First(&uu)
    fmt.Println(uu)
}
{1 user1 [{1 1 card1} {2 1 card2}]}
带条件的查询
    var uu User
    db.Preload("Cards", func(db *gorm.DB) *gorm.DB {
        return db.Where("name=?", "card1")
    }).First(&uu)
    fmt.Println(uu)
    var uu User
    db.Preload("Cards", "name=?", "card1").First(&uu)
    fmt.Println(uu)
{1 user1 [{1 1 card1}]}

多级嵌套

结构体定义
type Info struct {
    ID     uint
    Money  uint
    CardID uint
}
type Card struct {
    ID     uint
    UserID uint
    Name   string
    Info   Info
}
type User struct {
    ID    uint
    Name  string
    C
    Cards []Card
}
查询
    var uu User
    db.Preload("Cards.Info").Preload("Cards").First(uu)
    fmt.Println(uu)
或者
    var uu User
    db.Preload("Cards.Info").First(uu)
    fmt.Println(uu)
带条件的查询
    var uu User
    db.Preload("Cards.Info").Preload("Cards","name=?","card1").First(uu)
    fmt.Println(uu)
    db.Preload("Cards", func(db *gorm.DB) *gorm.DB {
        return db.Joins("Info").Where("money>1000")
    })
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容