• Golang Gorm 一对多 关联模式 Association + Find 查询关联


    查找关联


    1. // User 拥有并属于多种 language,`user_languages` 是连接表
    2. type User struct {
    3. gorm.Model
    4. Languages []Language `gorm:"many2many:user_languages;"`
    5. }
    6. type Language struct {
    7. gorm.Model
    8. Name string
    9. }

    查找所有匹配的关联记录

    db.Model(&user).Association("Languages").Find(&languages)

    查找带条件的关联

    1. codes := []string{"zh-CN", "en-US", "ja-JP"}
    2. db.Model(&user).Where("code IN ?", codes).Association("Languages").Find(&languages)
    3. db.Model(&user).Where("code IN ?", codes).Order("code desc").Association("Languages").Find(&languages)

    ------------------------------------------------------------------------------------------------------------------------------

     

    使用 Association 方法, 需要把 User 查询好, 然后根据 User 定义中指定AssociationForeignKey 去查找CreditCard。

    查询某条数据使用first 查询唯一值

    1. u := &User{Id: 1}
    2. db.Debug().First(u)
    3. fmt.Println(u)
    4. db.Where("id=?",u.Id).First(u)
    1. import (
    2. "fmt"
    3. "gorm.io/driver/mysql"
    4. "gorm.io/gorm"
    5. )
    6. type User struct {
    7. gorm.Model
    8. UserName string `json:"username" gorm:"column:username"`
    9. CreditCards []CreditCard `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
    10. }
    11. type CreditCard struct {
    12. gorm.Model
    13. Number string
    14. UserID int
    15. }
    16. func main() {
    17. dsn6 := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
    18. db, _ := gorm.Open(mysql.Open(dsn6), &gorm.Config{})
    19. db.AutoMigrate(&User{}, &CreditCard{})
    20. //查找 用户名为 lucas 的所有信用卡信息
    21. u1 := &User{UserName: "lucas"}
    22. //Association必须要先查出User才能关联查询对应的CreditCard
    23. db.First(u1)
    24. db.Model(u1).Association("CreditCards").Find(&u1.CreditCards)
    25. fmt.Println(u1)
    26. }

    这里只查找了creditcard

    [1.513ms] [rows:2] SELECT * FROM `credit_cards` WHERE `credit_cards`.`user_id` = 1 AND `credit_cards`.`deleted_at` IS NULL
    associate是先去获取user,再去获取creditcard !!!!!!!!!
    
    var u User
    db.Debug().Where("name = ?", "lucas").Find(&u)
    fmt.Println(u)
    [2.756ms] [rows:1] SELECT * FROM `user` WHERE name = 'lucas'
    {1 lucas []}
    
    // 关联查询的结果,保存到user.CreditCard属性
    
    db.Debug().Model(&u).Association("Articles").Find(&u.Articles)
    fmt.Println(u)
    [0.712ms] [rows:2] SELECT * FROM `article` WHERE `article`.`user_id` = 1
    {1 lucas [{1 k8s 1 {0  []}} {2 golang 1 {0  []}}]} 
    1. a := make([]Article, 10)
    2. var u User
    3. db.Take(&u, 3)
    4. db.Model(&u).Association("Articles").Find(&a)
    5. fmt.Println(u)
    6. fmt.Println(a)
    7. {3 lucas []}
    8. [{4 golang 3 {0 []}} {5 k8s 3 {0 []}}]

    联表  Association


    外键设定

    一旦能接受新的模式,就可以说一说外键设定了,两个结构体之间相互关联,最直接的想法是我怎么从一个结构体出发然后去获得另一个结构体。

    外键

    如果我需要通过User去查找它拥有哪些CreditCard, 那么实际上我做的事情 = "拿着User主键去CreditCard表查询". 

    一旦理解外键是怎么设置的, 我们就可以开始用上外键了, 概念:Association 是一个笼统的工具, 用于管理所有关联关系,以上面的Card&User为例,,我们来管理以上两表之间的关联关系(上面两表,采用默认外键/主键的方式相互关联)

    1. cs := []CreditCard{}
    2. xiaohan := &User{
    3. Model:gorm.Model{
    4. ID:1,
    5. },
    6. }
    7. // 所有与xiaohan(id=1)相关联的CreditCard,找出来
    8. d.Model(xiaohan).Association("CreditCards").Find(&cs)
    9. // xiaohan数据取消与ID=1的CreditCard取消关联
    10. d.Model(xiaohan).Association("CreditCards").Delete(&CreditCard{
    11. Model:gorm.Model{
    12. ID:1,
    13. },
    14. })

    model 先拿到这张表,然后去连接tags第三张表。之后就是最关键的要去执行什么操作,这个操作可以是delete clean append

    // xiaohan与CreditCard之间添加关联 
    d.Model(xiaohan).Association("Languages").Append(&cards)

    // 取消所有关联
    db.Model(xiaohan).Association("Languages").Clear()

    // 对象关联计数
    db.Model(xiaohan).Association("Languages").Count()

  • 相关阅读:
    Vue单文件组件(SFC)规范
    14. Mybatis 删除操作-delete
    霍夫曼树(Huffman Tree)
    【Java】泛型讲解
    <Linux系统复习>进程概念
    JSON 与 Java 对象之间的转化
    命令执行相关函数及各类命令执行绕过技巧
    【动手深度学习-笔记】注意力机制(二)注意力评分函数
    89.(cesium篇)cesium聚合图(自定义图片)
    Web APIs简介 Dom
  • 原文地址:https://blog.csdn.net/qq_34556414/article/details/133143806