版权声明:本文为博主原创文章,未经博主允许不得转载。

其实我的需求就是:一个树状目录,每个目录下都存有成果,给定某一个上级目录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)