【问题标题】:How to paginate related data in gorm?如何在gorm中对相关数据进行分页?
【发布时间】:2021-05-26 07:31:20
【问题描述】:

我正在创建一个允许用户发布书籍引用的应用程序。用户可以将其他用户发布的报价添加到他们的收藏夹中。

这是我的数据模型。

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

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" validate:"required,min=1,max=400"`
    Page          int       `json:"page" validate:"gte=0,lte=50560"`
    Published     bool      `gorm:"default:false" json:"published"`
    Book          Book      `json:"book" validate:"required"`
    Tags          []Tag     `gorm:"many2many:quotes_tags;" json:"tags" validate:"required"`
    BookID        int       `json:"book_id"`
    User          User      `json:"user"`
    UserID        string    `json:"user_id"`
    FavoriteUsers []User    `gorm:"many2many:users_quotes;" json:"favorite_users"`
}


我想通过指定限制和偏移来检索用户使用分页添加到收藏夹中的报价。

func (service *Service) GetUserById(uid string) (models.User, error) {
    user := models.User{}
    if result := service.db.
        Preload("FavoriteQuotes.Tags").
        Preload("FavoriteQuotes.Book").
        Preload("FavoriteQuotes.User").
        Preload("Quotes", "published IS true").
        Preload("Quotes.Book").
        Preload("Quotes.Tags").
        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.GetUserById(uid)
    if err != nil {
        return []models.Quote{}, err
    }
    return user.FavoriteQuotes, nil
}

这是我目前获得最喜欢的报价的方式,但我不知道如何实现分页。是否可以使用 gorm 查询来实现这一点?

【问题讨论】:

    标签: go-gorm


    【解决方案1】:

    当然,您可以使用Custom Preloading SQL。基本上,您传递一个返回自定义查询的函数,例如:

    Preload("FavoriteQuotes", func(db *gorm.DB) *gorm.DB {
       return db.Offset(0).Limit(10)
    })
    

    【讨论】:

    • 您的回答对我很有帮助。谢谢!
    猜你喜欢
    • 2013-04-03
    • 2015-08-10
    • 2022-01-21
    • 2019-06-09
    • 1970-01-01
    • 2021-06-14
    • 2014-07-17
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多