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

试图弄清楚如何使用 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

           } 

第一部分完美运行。但是查询的第二部分不起作用,甚至不会产生任何错误。在这种情况下我该怎么办?常见的查询部分可能庞大而复杂。因此,为了获得计数而再次重写它可能容易出错。那么有没有办法让我保留公共查询部分并有时为已发布的课程执行它..有时为已发布的课程计数?


回首忆惘然
浏览 67回答 1
1回答

慕的地6264312

我不相信 GORM 打算让您以这种方式重用您的查询。很难明确地说,但它很可能不起作用,因为仍有一些状态是共享的。这:按结构published_course_count := *common_query_part的值进行复制gorm.DB,但如果该结构包含任何指针(它确实包含),那么这些指针也会被复制,从而导致两个单独的结构具有指向相同对象的指针,因此仍然被“链接”。您需要一个专用的克隆功能,该功能确实存在于gorm中但未公开。我建议您将通用部分的生成放在一个函数中并调用它两次,这样您就不必复制粘贴相同的查询。func common_query_part() *gorm.DB {&nbsp; &nbsp; return app.GetDB().&nbsp; &nbsp; &nbsp; &nbsp; Model(&models.Course{}).&nbsp; &nbsp; &nbsp; &nbsp; Where("status=?", models.CourseStatusPublished)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go