GROM官網(wǎng) Many To Many
操作調(diào)試記錄文件,解決一些多表關(guān)聯(lián)的問題。
默認不使用全局日志輸出,可以在執(zhí)行前的代碼加上Debug() 可以輸出執(zhí)行的SQL語句
例如:db.Debug().Unscoped().Delete(&user)
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
// User 一個用戶擁有多種語言,使用 `user_languages` 作為連接表
type User struct {
gorm.Model
Name string
Phone string
Languages []*Language `gorm:"many2many:user_languages;"`
}
// Language 一種語言屬于多個用戶,使用 `user_languages` 作為連接表
type Language struct {
gorm.Model
Name string
Users []*User `gorm:"many2many:user_languages;"`
}
// 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)
// 創(chuàng)建表
// db.CreateTable(&User{})
// db.CreateTable(&Language{})
// 檢查表是否存在
// db.HasTable(&User{})
// 刪除表
// db.DropTable(&User{})
// 不存在表時創(chuàng)建
db.AutoMigrate(&User{}, &Language{})
// ========
// = 創(chuàng)建 =
// ========
// 插入-重復(fù)創(chuàng)建并關(guān)聯(lián)
newUser := User{Name: "Jinzhu", Phone: "15612341234", Languages: []*Language{&Language{Name: "中文"}, &Language{Name: "英語"}}}
db.Create(&newUser)
fmt.Println(newUser)
// 使用語言關(guān)聯(lián)用戶-重復(fù)創(chuàng)建并關(guān)聯(lián)
// language := Language{Name: "法語", Users: []*User{&User{Name: "Jinzhu1", Phone: "19912341234"}, &User{Name: "Jinzhu2", Phone: "16612341234"}}}
// db.Create(&language)
// fmt.Println(language)
// 開始已有語言集選項-不必重復(fù)添加
// languages := []*Language{&Language{Name: "中文"}, &Language{Name: "英語"}}
// for _, language := range languages {
// db.Create(language)
// }
// 后來用戶選擇已有語言ID進行關(guān)聯(lián)-還是會更新關(guān)聯(lián)
// user := User{Name: "Jinzhu", Phone: "15612341234"}
// languages := []*Language{}
// db.Where("id IN (?)", []uint{1, 2}).Find(&languages)
// user.Languages = languages
// db.Create(&user)
// fmt.Println(user)
// 正確使用添加后關(guān)聯(lián)-這個不會更新關(guān)聯(lián)
// u := &User{Name: "dispaly", Phone: "13412341234"}
// db.Create(u)
// 關(guān)聯(lián)一個
// language := Language{}
// db.First(&language, 1)
// db.Model(&u).Association("Languages").Append(language)
// 關(guān)聯(lián)多個
// languages := []*Language{}
// db.Where("id IN (?)", []uint{1, 2}).Find(&languages)
// db.Model(&u).Association("Languages").Append(languages)
// fmt.Println(u)
// 使用語言關(guān)聯(lián)用戶
// language := Language{Name: "德語"}
// db.Create(&language)
// language := Language{}
// db.First(&language, 4)
// u := User{}
// db.First(&u, 2)
// db.Model(&language).Association("Users").Append(u)
// 用戶對象數(shù)據(jù)
user := User{}
db.First(&user, 1)
// ========
// = 查詢 =
// ========
// 通過 Related 使用 many to many 關(guān)聯(lián)
db.Model(&user).Related(&user.Languages, "Languages")
// 查找匹配的關(guān)聯(lián)
// db.Debug().Model(&user).Association("Languages").Find(&user.Languages)
// 預(yù)加載分兩條查詢語句
// user := User{}
// db.Debug().Preload("Languages").Find(&user, "id = ?", 2)
fmt.Print(user.Name + " : ")
for _, language := range user.Languages {
fmt.Print(language.Name + " ")
}
// 使用語言查詢關(guān)聯(lián)的用戶
// language := Language{}
// db.First(&language, 1)
// db.Model(&language).Related(&language.Users, "Users")
// fmt.Print(language.Name + " : ")
// for _, user := range language.Users {
// fmt.Print(user.Name + " ")
// }
// ========
// = 更新 =
// ========
// 使用創(chuàng)建新關(guān)聯(lián)替換當前關(guān)聯(lián)
// 單個
// language := Language{}
// db.First(&language, 1)
// db.Model(&user).Association("Languages").Replace(language)
// 多個
// languages := []*Language{}
// db.Where("id IN (?)", []uint{1, 2}).Find(&languages)
// db.Model(&user).Association("Languages").Replace(languages)
// fmt.Println(user)
// ========
// = 清除 =
// ========
// 清空對關(guān)聯(lián)的引用,不會刪除關(guān)聯(lián)本身
// db.Model(&user).Association("Languages").Clear()
// 刪除關(guān)聯(lián)的引用,不會刪除關(guān)聯(lián)本身
// &user.Languages 普通查詢?yōu)榭?,需要關(guān)聯(lián)查詢得到
// db.Model(&user).Association("Languages").Delete(&user.Languages)
// ========
// = 刪除 =
// ========
// 刪除時,清空引用后再執(zhí)行刪除
// db.Debug().Delete(&user)
// 默認軟刪除,Unscoped()記錄刪除
// db.Debug().Unscoped().Delete(&user)
// fmt.Println(user)
// ========
// = 總數(shù) =
// ========
// 獲取關(guān)聯(lián)的總數(shù)
count := db.Model(&user).Association("Languages").Count()
fmt.Printf("\r\n關(guān)聯(lián)總數(shù):%d", count)
}