2012-07-20 121 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

希望這會有所幫助。乾杯!