2012-07-20 42 views
81

我需要由两列命令数据时(当行具有对列号1,为了通过它不同的值;否则,为了通过列号2)订单通过与学说多个列

我使用的一个QueryBuilder来创建查询。

如果我第二次调用orderBy方法,它会替换以前指定的任何顺序。

我可以通过两列作为第一个参数:

->orderBy('r.firstColumn, r.secondColumn', 'DESC'); 

但我不能传递两个排序方向为第二个参数,所以,当我执行这个查询的第一列是在上升方向和有序第二个,下降。我想为他们两个使用降序。

有没有办法做到这一点使用QueryBuilder?我需要使用DQL吗?

回答

161

你有列名之后的顺序方向加:

$qb->orderBy('column1 ASC, column2 DESC'); 

正如你所指出的那样,orderBydo not stack多个电话,但你可以多次调用addOrderBy

$qb->addOrderBy('column1', 'ASC') 
    ->addOrderBy('column2', 'DESC'); 
+0

谢谢。我以前没有注意到这一点。我认为有两个ord​​erBy语句可以。所以我没有意识到addOrderBy方法。欢呼指出它:) – Sharpy35 2017-07-12 14:43:18

5

你可以使用->addOrderBy($sort, $order)

Add:Doctrine Querybuilder btw。经常使用的常规方法“特殊”的修改,见select-addSelectwhere-andWhere-orWheregroupBy-addgroupBy ...

11

教义2.x的,你不能使用原则“排序依据”或“addOrderBy”如上面的例子中通过多个订单。因为,当您将第二个参数留空时,例如在'orderBy'函数中,它会在最后一个列名称末尾自动添加'ASC'。

举一个例子,->orderBy('a.fist_name ASC, a.last_name ASC')会输出类似于'ORDER BY first_name ASC,last_name ASC ASC'的SQL。所以这是SQL语法错误。只是因为orderBy或addOrderBy的默认值是'ASC'。

要添加多个订单,您需要使用'添加'功能。它会是这样的。

->add('orderBy','first_name ASC, last_name ASC')。这会给你正确格式化的SQL。

有关add()函数的更多信息。 http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.QueryBuilder.html#_add

希望这会有所帮助。干杯!