使用Doctrine按多列排序

时间:2012-07-20 08:06:31

标签: php doctrine sql-order-by

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

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

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

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

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

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

有没有办法使用QueryBuilder执行此操作?我需要使用DQL吗?

6 个答案:

答案 0 :(得分:191)

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

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

如您所知,多次拨打orderBy do not stack,但您可以多次拨打addOrderBy

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

答案 1 :(得分: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

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

答案 2 :(得分:7)

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

添加:Doctrine Querybuilder btw。通常使用常规方法的“特殊”修改,请参阅select-addSelectwhere-andWhere-orWheregroupBy-addgroupBy ......

答案 3 :(得分:1)

orderBy源代码注释为Keys are field and values are the order, being either ASC or DESC.。这样您就可以orderBy->(['field' => Criteria::ASC])了。

答案 4 :(得分: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)
   ;

答案 5 :(得分:0)

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

示例:

$this->createQueryBuilder('entity')
       ->orderBy('entity.addDate', 'DESC')
       ->addOrderBy('entity.id', 'DESC')