gorm關聯查詢的坑

背景:最近在學習 golang,嘗試將以前的 PHP 項目用 go 改寫一下。
涉及的表模型以下三個:html

// 文章
type Topics struct {
    Id              int    `gorm:"primary_key"`
    Title           string `gorm:"not null"`
    Body            string `gorm:"not null"`
    UserId          int    `gorm:"not null"`
    CategoryId      int    `gorm:"not null"`
    Status          int    `gorm:"default:1"`
    CreatedAt       time.Time
    UpdatedAt       time.Time
    Category Categories    `gorm:"foreignkey:CategoryId"`
    User     Users         `gorm:"foreignkey:UserId"`
}
// 用戶
type Users struct {
    Id                int    `gorm:"primary_key"`
    Name              string `gorm:"not null"`
    Email             string `gorm:"not null"`
    Password          string `gorm:"not null"`
    Avatar            string
    CreatedAt         time.Time
    UpdatedAt         time.Time
    LastActivedAt     time.Time
}
// 分類
type Categories struct {
    Id          int        `gorm:"primary_key"`
    Name        string     `gorm:"not null"`
    Description string     `gorm:"not null"`
    PostCount   int
    CreatedAt   time.Time
    UpdatedAt   time.Time
}

首先找到 gorm 官方文檔的相關介紹:
http://doc.gorm.io/associatio...
1431188688-5b9a1952df3b3golang

躍躍欲試(code V1):bash

func (Topics) TopicByID(id int) (*Topics, error) {
    db := DB()
    defer db.Close()

    var topic Topics

    // 1. 
    //result := db.Model(&topic).Where("id=?", id).Related(&topic.User)

    //2. 
    //db.Where("id=?", id).First(&topic)
    //result := db.Model(&topic).Related(&topic.User)
    
    if err := result.Error; err != nil {
        return &topic, err
    }

    if result.RecordNotFound() == true {
        return &topic, utils.Error("文章不存在!")
    }

    return &topic, nil
}

代碼中的兩種形式基本上是我再百度以後找到的結果。嘗試了一番,都報錯:(invalid association [])。
而後在考慮是否個人外鍵定義的有問題:學習

1667779980-5b9a1c75cbfb9

(也沒問題)測試

繼續百度,找到 gorm的關聯問題。其中:
2497737772-5b9a1f261e69dspa

這裏 Reload方法加了第二個參數,因而查看gorm關於這個方法的介紹:
3440361819-5b9a20fd009f03d

能夠加對應的外鍵參數,測試成功。code

最終代碼(code V2):orm

func (Topics) TopicByID(id int) (*Topics, error) {
    db := DB()
    defer db.Close()

    var topic Topics

    db.Where("id=?", id).First(&topic)
    // 關聯的關鍵代碼
    db.Model(&topic).Related(&topic.Category, "CategoryId")
    result := db.Model(&topic).Related(&topic.User, "UserId")

    //result := db.Where("id=?", id).Preload("Category").Preload("User").First(&topic)
    if err := result.Error; err != nil {
        return &topic, err
    }

    if result.RecordNotFound() == true {
        return &topic, utils.Error("文章不存在!")
    }

    return &topic, nil
}

注:註釋部分的 Preload 方法感受更加方便簡潔。htm

輸出結果: // 包含了文章內容,文章對應用戶信息,以及文章分類信息

{
6 測試話題2 <p>who are you?</p> 1 3 0 0 0 0   1 2018-09-11 14:30:39 +0800 CST 2018-09-11 14:43:44 +0800 CST 
{3 問答 請保持友善,互幫互助 0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC} 
{1 aurora test@mail.com 3ffd3de33d3c8bf09bf835d8f7f9b0e0 http://local.beego.com/static/upload/2018/09/07/deepin-cc.png 啦啦啦啦啦~嗝 b506cf029de29c626a1a27bc4d70f5b0 0 2018-08-28 15:56:39 +0800 CST 2018-09-07 14:32:46 +0800 CST 0001-01-01 00:00:00 +0000 UTC}
}

總結:

以前文章的恢復,內容還沒來得及整理,將就看下吧

相關文章
相關標籤/搜索