Go 中 GORM 预加载如何自定义排序和过滤关联数据?

go 中 gorm 预加载如何自定义排序和过滤关联数据?

go 中 gorm 自定义预加载的用法

想要通过预加载查询对象关联数据,而自定义预加载的用法需要使用 func(query *gorm.db) *gorm.db {} 这个匿名函数。在这个回调函数里,可以对关联查询的结果进行控制和操作,比如排序、过滤等。

例如,假设需要查询商品列表,并按照商品 id 降序排序:

type LabelType struct {
    ...
    GoodsList []Goods `gorm:"ForeignKey:LabelId" json:"goods_list"` //查询当前分类下的商品集合
}

type Goods struct {
    ...
    Category Category `gorm:"foreignkey:CategoryID" json:"category"` //分类表
}

func (labelModel *LabelType) GetAll(params *request.IndexParams) (labelTypes []*LabelType) {
    err := db.Debug().Model(&labelTypes).
        Preload("GoodsList", func(query *gorm.DB) *gorm.DB {
            return query.Order("goods_id desc")
        }).
        Preload("GoodsList.Category").
        Where("mall_id = ? and status = ?", params.MallId, "normal").Order("weigh desc").
        Find(&labelTypes).Error
    if err != nil && err != gorm.ErrRecordNotFound {
        return nil
    }
    return labelTypes
}

在这个预加载回调函数中,query.order("goods_id desc") 表示按照商品 id 降序排序关联查询的结果。

案例中遇到的错误,是因为 go 的 gorm v1 和 v2 版本的不同。这个问题已得到解决,请确保使用正确的版本。

以上就是Go 中 GORM 预加载如何自定义排序和过滤关联数据?的详细内容,更多请关注其它相关文章!