按多列排序,带有教义

2022-08-30 07:00:20

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

我正在使用 a 来创建查询。QueryBuilder

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

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

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

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

有没有办法使用?我是否需要使用 DQL?QueryBuilder


答案 1

您必须在列名称之后添加顺序方向:

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

如您所见,多个调用不堆叠,但您可以进行多个调用以 addOrderByorderBy

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

答案 2

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

例如,将输出类似这样的SQL“按FIRST_NAME ASC排序,last_name ASC ASC”。所以这是SQL语法错误。仅仅因为订单的默认值By或addOrderBy是“ASC”。->orderBy('a.fist_name ASC, a.last_name 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

希望这有帮助。干杯!


推荐