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