为了账号安全,请及时绑定邮箱和手机立即绑定

有条件地构建查询并保持公共部分以不同方式执行

有条件地构建查询并保持公共部分以不同方式执行

Go
回首忆惘然 2022-10-10 19:11:23
试图弄清楚如何使用 gorm 有条件地构建查询,保存公共查询部分并执行它。假设我正在查询如下课程列表。common_query_part := app.GetDB(). // <= this returns *gorm.DB        Model(&models.Course{}).        Where("status=?", models.CourseStatusPublished) //models.CourseStatusPublished is a constant现在我想获取已发布课程的列表。并得到它的计数。所以我就这样试了。published_course_count := *common_query_part然后是课程列表   result := common_query_part.                 Offset(offset).                 Limit(limit).                 find(&courses)          if result.Error !=nil {         //handle error       } 并为计数result = published_course_count.Count(&total)       if result.Error !=nil {             //handle error           } 第一部分完美运行。但是查询的第二部分不起作用,甚至不会产生任何错误。在这种情况下我该怎么办?常见的查询部分可能庞大而复杂。因此,为了获得计数而再次重写它可能容易出错。那么有没有办法让我保留公共查询部分并有时为已发布的课程执行它..有时为已发布的课程计数?
查看完整描述

1 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

我不相信 GORM 打算让您以这种方式重用您的查询。很难明确地说,但它很可能不起作用,因为仍有一些状态是共享的。


这:按结构published_course_count := *common_query_part的值进行复制gorm.DB,但如果该结构包含任何指针(它确实包含),那么这些指针也会被复制,从而导致两个单独的结构具有指向相同对象的指针,因此仍然被“链接”。您需要一个专用的克隆功能,该功能确实存在于gorm中但未公开。


我建议您将通用部分的生成放在一个函数中并调用它两次,这样您就不必复制粘贴相同的查询。


func common_query_part() *gorm.DB {

    return app.GetDB().

        Model(&models.Course{}).

        Where("status=?", models.CourseStatusPublished)

}


查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信