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方法,可以无限迭代查询条件,非常灵活。
亲爱的你学会了么