版权声明:本文为博主原创文章,未经博主允许不得转载。
其实我的需求就是:一个树状目录,每个目录下都存有成果,给定某一个上级目录id,分页查询出这个目录下以及子孙目录下的所有成果,要求分页。
这个树状目录比如
projectid1
|
|
——projectid2
|
——projectid3
也就是parentid=projectid1 or parentid=projectid2 or parentid=projectid3……不定数量
给定projectid1,查出所有子孙projectid2和projectid3,循环
开始想着拼接sql语句,看到顶部那个获得灵感,用beego的orm拼接吧
cond := orm.NewCondition()
cond1 := cond.Or("ProjectId", pid)
//查出所有子孙项目
//取到所有子孙pid
sonproj, _ := GetProjectsbyPid(pid)
for _, v := range sonproj {
cond1 = cond1.Or("ProjectId", v.Id)
}
cond2 := cond.Or("Code__contains", key).Or("Title__contains", key).Or("Label__contains", key).Or("Principal__contains", key)
cond3 := cond.AndCond(cond1).AndCond(cond2)
//(...or...or...)and()
o := orm.NewOrm()
qs := o.QueryTable("Product")
qs = qs.SetCond(cond3)
//循环这个id下所有项目?
_, err = qs.Limit(limit, offset).Distinct().OrderBy("-created").All(&prod)
if err != nil {
return prod, err
}
return prod, err
经过初步测试,似乎是可以的啊,哈哈。
下面这2者没有测试过,确实涨知识了,感觉下面这些才是正确的方法,我的这个方法太low了。一个字段匹配多值
这个是属于xorm中的:
In(string, …interface{})某字段在一些值中,这里需要注意必须是[]interface{}才可以展开,由于Go语言的限制,[]int64等不可以直接展开,而是通过传递一个slice。示例代码如下:
engine.In("cloumn", 1, 2, 3).Find()
engine.In("column", []int{1, 2, 3}).Find()
或者beego的sql原生语句查询
使用SQL语句进行查询?
ids := []int{1, 2, 3}
p.Raw("SELECT name FROM user WHERE id IN (?, ?, ?)", ids)