Home Articles

使用Doctrine按多列排序

Asked
Viewed 553 times
93

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

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

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

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

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

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

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

4 Answers

  • 182

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

    添加:Doctrine Querybuilder btw . 经常使用正常方法的"special"修改,参见 select-addSelectwhere-andWhere-orWheregroupBy-addgroupBy ...

  • 14

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

  • 5

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

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

    如您所述,多次调用 orderBy do not stack,但您可以多次调用addOrderBy

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

    在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语法错误 . 只是因为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

    希望这可以帮助 . 干杯!

Related