Golang Go语言中 gorm 自定义预加载的正确用法是什么?一直报错:invalid query condition

Golang Go语言中 gorm 自定义预加载的正确用法是什么?一直报错:invalid query condition

// 首页活动模块区域分类表模型
type LabelType struct {
Model
Id           int    json:"id";gorm:"primary_key"
MallId       int    json:"mall_id"
Name         string json:"name"
Weigh        int    json:"weigh"  // 权重
GoodsList []Goods gorm:"ForeignKey:LabelId" json:"goods_list" //查询当前分类下的商品集合
}

type Goods struct {
    Model
    GoodsId         int               `json:"goods_id" gorm:"primary_key"`
    MallId          int               `json:"mall_id"`     // 商城 id
    LabelId         int               `json:"label_id"`    // 关联 mall_label_type
    GoodsName       string            `json:"goods_name"`  // 商品名称
    CategoryId      int               `json:"category_id"` // 分类 id
    SmallImage      string            `json:"small_image"` // 商品缩略图
    Images          string            `json:"images"`
    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
}

更多关于Golang Go语言中 gorm 自定义预加载的正确用法是什么?一直报错:invalid query condition的实战教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

LabelType 代码补全
<br>// 首页活动模块区域分类表模型<br>type LabelType struct {<br> Model<br> Id int `gorm:"primary_key" json:"id"`<br> MallId int `json:"mall_id"`<br> Name string `json:"name"`<br> Images string `json:"images"` // 背景图<br> Status string `json:"-"` // normal 开启 hidden 关闭<br> Weigh int `json:"weigh"` // 权重, 越大越靠前<br> CreateTime int `json:"-"`<br> UpdateTime int `json:"-"`<br> GoodsList []LitestoreGoods `gorm:"ForeignKey:LabelId" json:"goods_list"` //查询当前分类下的商品集合<br>}<br>

更多关于Golang Go语言中 gorm 自定义预加载的正确用法是什么?一直报错:invalid query condition的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


加 func(query gorm.DB) gorm.DB { return query.Order(“goods_id desc”)} 就会报错
invalid query condition:
不加这个是可以正常查询的

去掉 Model(&labelTypes)试下

没用的。能使的方法都试过。

你的 ForeignKey:LabelId 写错了吧,难道不是应该是 GoodId 吗,然而在你的 LabelType 结构体里面没有看到这个字段

我查询的是 模块分类列表,然后列出 模块分类下的商品集合,没毛病吧。而且我也说了呀 加 func(query gorm.DB) gorm.DB { return query.Order(“goods_id desc”)} 就会报错, 不加这个 是可以正常查出来我想要的数据的呀。

问题已解决!

在Go语言中,使用GORM进行自定义预加载(Preload)时,如果遇到“invalid query condition”错误,通常是因为预加载的条件表达式有误或者与预加载的关联模型不匹配。下面是如何正确使用GORM自定义预加载的一些建议:

  1. 确保关联关系定义正确:在GORM模型中,确保使用gorm:"foreignKey"等标签正确设置了外键关系。

  2. 使用关联函数进行预加载:自定义预加载时,应使用关联函数(如Preload)并传入一个匿名函数来定义加载条件。例如:

    db.Preload("Orders", func(db *gorm.DB) *gorm.DB {
        return db.Where("status = ?", "shipped")
    }).Find(&users)
    

    这里,Ordersusers的一个关联关系,预加载时只加载状态为“shipped”的订单。

  3. 检查条件表达式:确保预加载条件中的字段名称、数据类型和逻辑表达式正确无误。错误的字段名或数据类型不匹配都会导致“invalid query condition”错误。

  4. 使用链式调用:如果预加载条件复杂,可以使用GORM的链式调用来逐步构建查询条件。

  5. 查看错误和日志:启用GORM的详细日志模式,可以帮助诊断问题所在。

如果以上步骤仍然无法解决问题,建议检查GORM版本和文档,确认是否有已知的bug或API变更。同时,确保代码中的其他部分(如模型定义和数据库迁移)也是正确和一致的。

回到顶部