在使用gofream的 Fields() 和 Count() 操作出现了问题
如下为 resume 表左连接 post 表进行的一个简单的链式调用
func (s *sServer) GetResumes4Page(ctx g.Ctx, req *v1.GetDateReq) (res *v1.GetDateRes, err error) {
err = g.Try(ctx, func(ctx g.Ctx) {
m := g.DB().Model("resume r").Safe().Ctx(ctx)
// #1
m = m.LeftJoin("post p", "r.post_id = p.id").Fields("r.*", "p.name post_name")
// 中间省略一些判断代码
if ...{
.....
....
}
// #2
res.Total, err = m.Count()
err = m.Page(req.PageNum, req.PageSize).Scan(&res.Records)
})
return
}
运行发现日志报错,并打印出报错的sql
SELECT COUNT(r.*,p.name post_name)
FROM `recruit_resume` r LEFT JOIN `recruit_post` p ON (r.post_id = p.id)
WHERE (r.degree = 1) AND `r`.`deleted_at` IS NULL AND `p`.`deleted_at` IS NULL
其中明显看出 sql 语句中 Count()函数报错。
报错的原因是链式调用引起的
解决的办法是将 Count() 和 Fields() 分别进行执行,不适用同一个链式
func (s *sServer) GetResumes4Page(ctx g.Ctx, req *v1.GetDateReq) (res *v1.GetDateRes, err error) {
err = g.Try(ctx, func(ctx g.Ctx) {
m := g.DB().Model("resume r").Safe().Ctx(ctx)
m = m.LeftJoin("post p", "r.post_id = p.id")
// 中间省略一些判断代码
if ...{
.....
....
}
// #1
res.Total, err = m.Count()
// #2
err = m.Fields("r.*", "p.name post_name").Page(req.PageNum, req.PageSize).Scan(&res.Records)
})
return
}