gorm 编写复杂的查询逻辑

gorm是 golang 的一个强大的ORM框架,你可以用它来查询数据表,获取你要的数据。 

本文为大家介绍如何实现复杂的查询。下面直接看代码

 

offset := 0
	var specialPageVar int = 4
	offset = (curPage - 1) * perPage
	if offset < 0 {
		offset = 0;
	}
	commonpkg.LogInfoF("contentId: %d", contentId)
	commonpkg.DB.Model(&saymodel.SayModel{}).Count(&total)
	var query *gorm.DB
	if curPage >= specialPageVar {
		query = commonpkg.DB.Order("id desc")
	} else {
		query = commonpkg.DB.Order("quality desc, agree desc, id desc")
	}
	scwQuerySpecifiedContent := func (db *gorm.DB) *gorm.DB {
		return db
	}
	scwTopContentQuery := scwQuerySpecifiedContent
	scwFreshContent := scwQuerySpecifiedContent


	if contentId > 0 {
		 scwQuerySpecifiedContent = func (db *gorm.DB) *gorm.DB {
		 	return db.Where("id = ?", contentId)
		 }
	}
	var forceFirstData saymodel.SayModel
	var emptyData saymodel.SayModel
	if contentId <= 0 {
		if curPage < specialPageVar && total > int64(specialPageVar*perPage) {
			scwTopContentQuery = func(db *gorm.DB) *gorm.DB {
				return db.Where("id > ?", total-31)
			}
		}
	}
	if curPage == 1 {
		notFound := commonpkg.DB.Last(&forceFirstData).RecordNotFound()
		if !notFound {
			//最新的必须是在十分钟以内发布的
			if forceFirstData.Quality == 0 && forceFirstData.Agree == 0 &&
				!forceFirstData.CreatedAt.Before(time.Now().Add(-10*time.Minute)) {
				forceFirstId := forceFirstData.ID
				if contentId <= 0 {
					scwFreshContent = func(db *gorm.DB) *gorm.DB {
						return db.Where("id != ?", forceFirstId)
					}
				}
			} else {
				forceFirstData = emptyData
			}
		}
	}
	query.Scopes(scwTopContentQuery, scwFreshContent, scwQuerySpecifiedContent).Limit(perPage).Offset(offset).Find(&data)
	if curPage == 1 && forceFirstData != emptyData {
		data = append([]saymodel.SayModel{forceFirstData}, data...)
		data = data[0:len(data) - 1]
	}

代码是片段

注意,query.Scopes方法,官方文档:http://gorm.io/docs/method_chaining.html#Scopes

Scopes你可以理解为组合容器, 它可以几个查询条件一起来查询。

类似于sql 语句

select * from table where id > 10 and createDate > yesterday 

我们先建立几个scw开头的变量,他们先赋值给一个匿名函数,这个函数直接返回*gorm.DB, 可以理解为返回指针。

那么根据逻辑不同,我们可以继续编写业务逻辑,所以开始可以看得到真正的业务在匿名函数里。

最后,在query.Scopes 这里,把所有的查询聚拢在一起处理

最终他们会被执行,生成对应的sql语句

相对于手写sql来说,可读性要好一些。比起手动去拼装语句,用匿名函数+scopes方法,可以无限迭代查询条件,非常灵活。

亲爱的你学会了么

发布于: 2020-03-15 15:13:11, 点击数:

Tumblr
Pinterest
LinkedIn
Reddit
XING
WhatsApp
Hacker News
VK
Telegram