【问题标题】:How to get double nested data with gorm?如何使用gorm获取双嵌套数据?
【发布时间】:2021-05-19 15:14:03
【问题描述】:

我正在开发一个使用 go 和 gorm 管理报价的应用程序。用户创建报价,报价有多个标签,用户可以将报价添加到自己的收藏夹中。

我想获取用户添加到收藏夹的报价列表。那个时候,我想把标签附加到引号上。

这是我的数据模型。

type Quote struct {
    ID            int       `gorm:"primary_key" json:"id"`
    CreatedAt     time.Time `json:"created_at"`
    UpdatedAt     time.Time `json:"updated_at"`
    Text          string    `json:"text"`
    Page          int       `json:"page"`
    Published     bool      `gorm:"default:false" json:"published"`
    Tags          []Tag     `gorm:"many2many:quotes_tags;" json:"tags"`
    User          User      `json:"user"`
    UserID        string    `json:"user_id"`
    FavoriteUsers []User    `gorm:"many2many:users_quotes;" json:"favorite_users"`
}

type User struct {
    ID              string    `json:"id"`
    CreatedAt       time.Time `json:"created_at"`
    UpdatedAt       time.Time `json:"updated_at"`
    Username        string    `json:"username"`
    Quotes          []Quote   `json:"quotes"`
    FavoriteQuotes  []Quote   `gorm:"many2many:users_quotes;" json:"favorite_quotes"`
}

type Tag struct {
    ID        int       `gorm:"primary_key" json:"id"`
    CreatedAt time.Time `json:"created_at"`
    Name      string    `json:"name"`
}

我尝试了以下并得到了最喜欢的报价,但标签为空。有没有办法用gorm做到这一点?提前谢谢你。

func (service *Service) GetUser(uid string) (models.User, error) {
    fmt.Println(uid)
    user := models.User{}
    if result := service.db.Preload(clause.Associations).First(&user, "id = ?", uid); result.Error != nil {
        return models.User{}, result.Error
    }
    return user, nil
}

func (service *Service) GetFavoriteQuotes(uid string) ([]models.Quote, error) {
    user, err := service.GetUser(uid)
    if err != nil {
        return []models.Quote{}, err
    }
    return user.FavoriteQuotes, nil
}

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    如果您查看Preload All 文档,它会说:

    clause.Associations 不会预加载嵌套关联,但您可以将其与嵌套预加载一起使用

    在你的情况下,这将是这样的:

    if result := service.db.Preload("FavoriteQuotes.Tags").Preload(clause.Associations).First(&user, "id = ?", uid); result.Error != nil {
            return models.User{}, result.Error
        }
    

    【讨论】:

    • 这对我来说很好用!感谢您的准确回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    相关资源
    最近更新 更多