使用Doctrine按多列排序

zoo*_*opo 104 php doctrine sql-order-by

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

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

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

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

->orderBy('r.firstColumn, r.secondColumn', 'DESC');
Run Code Online (Sandbox Code Playgroud)

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

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

Die*_*lló 198

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

$qb->orderBy('column1 ASC, column2 DESC');
Run Code Online (Sandbox Code Playgroud)

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

$qb->addOrderBy('column1', 'ASC')
   ->addOrderBy('column2', 'DESC');
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。我以前没有注意到这一点。我认为两个 orderBy 语句可以解决这个问题。所以我没有意识到 addOrderBy 方法。欢呼指出它:) (2认同)

Anj*_*lva 15

在Doctrine 2.x中,您不能通过使用doctrine'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

希望这可以帮助.干杯!


小智 10

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

例子:

$this->createQueryBuilder('entity')
       ->orderBy('entity.addDate', 'DESC')
       ->addOrderBy('entity.id', 'DESC')
  
Run Code Online (Sandbox Code Playgroud)


Chr*_*ber 7

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

添加:Doctrine Querybuilder btw.经常使用的常规方法"特殊"的修改,见select-addSelect,where-andWhere-orWhere,groupBy-addgroupBy...