GROM Many To Many 多對多

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)

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應(yīng)的列上鍵入重復(fù)值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,973評論 0 9
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 6,335評論 0 10
  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 6,246評論 0 4
  • 1.A simple master-to-slave replication is currently being...
    Kevin關(guān)大大閱讀 6,245評論 0 3
  • 或許現(xiàn)在的你剛剛失戀,或許你還處在失戀的陰影當中無法自拔,又或許你已經(jīng)開始了一段新的戀情,有人說相信愛情還不如相信...
    陶小魚閱讀 591評論 0 5

友情鏈接更多精彩內(nèi)容