130

我需要按两列对数据进行排序(当行对第 1 列的值不同时,按它排序;否则,按第 2 列排序)

我正在使用 aQueryBuilder创建查询。

如果我orderBy第二次调用该方法,它将替换任何先前指定的排序。

我可以传递两列作为第一个参数:

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

但是我不能为第二个参数传递两个排序方向,所以当我执行这个查询时,第一列按升序排序,第二列按降序排序。我想对它们都使用降序。

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

4

6 回答 6

245

您必须在列名之后添加订单方向:

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

正如您所指出的,多次调用orderBy 不堆栈,但您可以多次调用addOrderBy

$qb->addOrderBy('column1', 'ASC')
   ->addOrderBy('column2', 'DESC');
于 2012-07-20T08:11:01.213 回答
19

在 Doctrine 2.x 中,您不能通过使用上述示例中的教义 'orderBy' 或 'addOrderBy' 来传递多个订单。因为,当您将第二个参数留空时,它会自动在最后一列名称的末尾添加“ASC”,例如在“orderBy”函数中。

例如,->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() 函数的更多信息。https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api

希望这可以帮助。干杯!

于 2014-03-28T16:42:01.303 回答
10

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

添加:Doctrine Querybuilder 顺便说一句。经常使用常规方法的“特殊”修改,请参阅select-addSelect, where-andWhere-orWhere, groupBy-addgroupBy...

于 2012-07-20T08:17:34.637 回答
4

您可以使用 orderBy() 后跟 addOrderBy() - 嵌套多个 orderBy() 是不可能的,但嵌套多个 addOrderBy() 也可以在初始 orderBy() 之后使用。

例子:

$this->createQueryBuilder('entity')
       ->orderBy('entity.addDate', 'DESC')
       ->addOrderBy('entity.id', 'DESC')
  
于 2021-05-07T14:16:41.037 回答
1

orderBy方法需要两个字符串或一个Expr\OrderBy对象。如果要添加多个订单声明,正确的做法是使用addOrderBy方法,或者实例化一个OrderBy对象并相应地填充它:

   # Inside a Repository method:
   $myResults = $this->createQueryBuilder('a')
       ->addOrderBy('a.column1', 'ASC')
       ->addOrderBy('a.column2', 'ASC')
       ->addOrderBy('a.column3', 'DESC')
   ;

   # Or, using a OrderBy object:
   $orderBy = new OrderBy('a.column1', 'ASC');
   $orderBy->add('a.column2', 'ASC');
   $orderBy->add('a.column3', 'DESC');

   $myResults = $this->createQueryBuilder('a')
       ->orderBy($orderBy)
   ;
于 2020-06-14T17:51:10.027 回答
0

orderBy源代码注释的注释: Keys are field and values are the order, being either ASC or DESC.. 所以你可以做到orderBy->(['field' => Criteria::ASC])

于 2018-11-02T00:13:02.520 回答