Go

GROM Has One 一对一

2019-11-17  本文已影响0人  TsMask

GROM官网 Has One

操作调试记录文件,解决一些多表关联的问题。
默认不使用全局日志输出,可以在执行前的代码加上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{Number: "110"}}
    db.Create(&newUser)
    fmt.Println(newUser)
    // 插入后补充
    // u := &User{Name: "dispaly", Phone: "13412341234"}
    // db.Create(u)
    // u.CreditCard = CreditCard{ Number: "120", UserID: u.ID }
    // db.Create(&u.CreditCard)
    // 添加后关联
    // u := &User{Name: "dispaly", Phone: "13412341234"}
    // db.Create(u)
    // db.Model(&u).Association("CreditCard").Append(CreditCard{ Number: "120", UserID: u.ID })
    // fmt.Println(u)

    // 用户对象数据
    user := User{}
    db.First(&user, 1)

    // ========
    // = 查询 =
    // ========
    // 通过 Related 使用 has one 关联
    // 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.Println(user.Name + " : " + user.CreditCard.Number)

    // ========
    // = 更新 =
    // ========
    // 使用创建新关联替换当前关联
    // db.Model(&user).Association("CreditCard").Replace(CreditCard{Number: "120", UserID: user.ID})
    // 使用规定值分配还是记录创建
    // 根据id查询后进行关联,不会创建新记录
    // creditCard := CreditCard{}
    // db.First(&creditCard, 1)
    // db.Model(&user).Association("CreditCard").Replace(creditCard)
    // fmt.Println(user.Name + " : " + user.CreditCard.Number)

    // ========
    // = 清除 =
    // ========
    // 清空对关联的引用,不会删除关联本身
    // db.Debug().Model(&user).Association("CreditCard").Clear()
    // 删除关联的引用,不会删除关联本身
    // 注意&user.CreditCard 普通查询为空,需要关联查询得到
    // db.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)
}

上一篇下一篇

猜你喜欢

热点阅读