beego的ORM中条件查询不生效的一个小坑
在beego中使用ORM做一些查询操作,一般会用到下面这样的代码
o := orm.NewOrm()
user := new(User)
qs = o.QueryTable(user) // 返回 QuerySeter
var users []User
qs.All(&user)
如果想增加一些条件限制就需要用到qs.Filter
或者qs.Exclude
,比如我想查询用户ID为1的用户,则上面代码就变成
o := orm.NewOrm()
user := new(User)
qs = o.QueryTable(user) // 返回 QuerySeter
var users []User
qs.Filter("id", 1) //增加查询条件
qs.All(&user)
这个时候会发现,返回的结果集还是所有用户。看一下Filter
函数的源码
func (o querySet) Filter(expr string, args ...interface{}) QuerySeter {
if o.cond == nil {
o.cond = NewCondition()
}
o.cond = o.cond.And(expr, args...)
return &o
}
可以看见Filter
函数的receiver
(o querySet)是以值拷贝的形式传递到函数内部,所以在调用函数时,并不会改变调用者的属性。
而All
、Values
、ValueList
等函数则是以指针方式传递,所以需要将代码写成如下形式。
qs = qs.Filter("id", 1)
qs.All(&users)
或者直接
qs.Filter("id", 1).All(&users)
这时候获取的结果集就是ID为1的用户。
猜测可能是作者考虑到在业务逻辑中需要多组不同的条件查询组合
,所以条件查询
的相关函数Receiver以指值拷贝方式传递,并返回拷贝对象的指针,这样可以方便创建多组不同的条件查询方案。
码字很辛苦,转载请注明来自雨林寒舍的《beego的ORM中条件查询不生效的一个小坑》
2019-01-02
开发笔记
评论