美文网首页Go
GROM Has Many 一对多

GROM Has Many 一对多

作者: TsMask | 来源:发表于2019-11-17 20:02 被阅读0次

    GROM官网 Has Many

    操作调试记录文件,解决一些多表关联的问题。
    默认不使用全局日志输出,可以在执行前的代码加上Debug() 可以输出执行的SQL语句
    例如:db.Debug().Unscoped().Delete(&user)

    package main
    
    import (
        "fmt"
    
        "github.com/jinzhu/gorm"
        _ "github.com/jinzhu/gorm/dialects/mysql"
    )
    
    // User 用户
    type User struct {
        gorm.Model
        Name       string
        Phone      string
        CreditCard []CreditCard `gorm:"foreignkey:UserID"`
    }
    
    // CreditCard 信用卡,UserID 是外键
    type CreditCard struct {
        gorm.Model
        Number string
        UserID uint
    }
    
    // main 一对多
    func main() {
        db, err := gorm.Open("mysql", "username:password@(127.0.0.1:3306)/database?charset=utf8&parseTime=True&loc=Local")
        if err != nil {
            println("err", err)
        }
        defer db.Close()
    
        // 启用Logger,显示详细日志
        // db.LogMode(true)
    
        // 创建表
        // db.CreateTable(&User{})
        // db.CreateTable(&CreditCard{})
        // 检查表是否存在
        // db.HasTable(&User{})
        // 删除表
        // db.DropTable(&User{})
        // 不存在表时创建
        db.AutoMigrate(&User{}, &CreditCard{})
    
        // ========
        // = 创建 =
        // ========
        // 插入
        newUser := User{Name: "Jinzhu", Phone: "15612341234", CreditCard: []CreditCard{CreditCard{Number: "666"}, CreditCard{Number: "888"}}}
        db.Create(&newUser)
        fmt.Println(newUser)
        // 插入后补充
        // u := &User{Name: "dispaly", Phone: "13412341234"}
        // db.Create(u)
        // u.CreditCard = []CreditCard{CreditCard{Number: "666", UserID: u.ID}, CreditCard{Number: "888", UserID: u.ID}}
        // for _, card := range u.CreditCard {
        //  db.Create(&card)
        // }
        // 添加后关联
        // u := &User{Name: "dispaly", Phone: "13412341234"}
        // db.Create(u)
        // 关联一个
        // db.Model(&u).Association("CreditCard").Append(CreditCard{Number: "120", UserID: u.ID})
        // 关联多个
        // db.Model(&u).Association("CreditCard").Append([]CreditCard{CreditCard{Number: "666", UserID: u.ID}, CreditCard{Number: "888", UserID: u.ID}})
        // fmt.Println(u)
    
        // 用户对象数据
        user := User{}
        db.First(&user, 1)
    
        // ========
        // = 查询 =
        // ========
        // 通过 Related 使用 has many 关联
        db.Model(&user).Related(&user.CreditCard, "CreditCard")
        // 如果 CreditCard 的外键字段为 UserID, 则能省略第二个参数,自动查找关系,如
        // db.Model(&user).Related(&user.CreditCard)
        // 查找匹配的关联
        // db.Debug().Model(&user).Association("CreditCard").Find(&user.CreditCard)
        fmt.Print(user.Name + " : ")
        for _, creditCard := range user.CreditCard {
            fmt.Print(creditCard.Number + "  ")
        }
    
        // ========
        // = 更新 =
        // ========
        // 关联时会创建新记录进行关联
        // db.Model(&user).Association("CreditCard").Replace([]CreditCard{CreditCard{Number: "120", UserID: user.ID}, CreditCard{Number: "220", UserID: user.ID}})
        // 根据id查询后进行关联,不会创建新记录
        // creditCard := CreditCard{}
        // db.First(&creditCard, 1)
        // db.Model(&user).Association("CreditCard").Replace(creditCard)
        // 在一对多中视情况,使用规定值分配还是记录创建
        // creditCards := []CreditCard{}
        // db.Where("id IN (?)", []uint{1, 2}).Find(&creditCards)
        // db.Model(&user).Association("CreditCard").Replace(creditCards)
        // fmt.Println(user)
    
        // ========
        // = 清除 =
        // ========
        // 清空对关联的引用,不会删除关联本身
        // db.Debug().Model(&user).Association("CreditCard").Clear()
        // 删除关联的引用,不会删除关联本身
        // 注意&user.CreditCard 普通查询为空,需要关联查询得到
        // db.Debug().Model(&user).Association("CreditCard").Delete(&user.CreditCard)
    
        // ========
        // = 删除 =
        // ========
        // 注意&user.CreditCard 普通查询为空,需要关联查询得到
        // db.Debug().Unscoped().Delete(&user.CreditCard)
        // 默认软删除,Unscoped()记录删除
        // db.Debug().Unscoped().Delete(&user)
        // fmt.Println(user)
    
        // ========
        // = 总数 =
        // ========
        // 获取关联的总数
        count := db.Model(&user).Association("CreditCard").Count()
        fmt.Printf("\r\n关联总数:%d", count)
    
    }
    
    

    相关文章

      网友评论

        本文标题:GROM Has Many 一对多

        本文链接:https://www.haomeiwen.com/subject/orcmictx.html