返回

Doctrine 按多列排序:手把手教你如何优雅地整理数据

php

Doctrine 中按多列排序

问题

在使用 Doctrine 时,需要按两列或更多列排序数据,当第一列的值不同时,按第一列排序;当第一列的值相同时,按第二列或后续列排序。

解决方法

Doctrine 提供了两种方法来实现按多列排序:

QueryBuilder 方法

$qb = $em->createQueryBuilder();

$qb->select('r')
    ->from('MyEntity', 'r')
    ->orderBy('r.firstColumn')
    ->addOrderBy('r.secondColumn', 'DESC');

DQL 方法

SELECT r
FROM MyEntity r
ORDER BY r.firstColumn ASC, r.secondColumn DESC

注意事项

  • 使用 QueryBuilder 方法时,必须先使用 orderBy 指定第一个排序列,然后才能使用 addOrderBy 添加后续排序列。
  • 使用 DQL 方法时,可以按任意顺序指定排序列,但按第一个排序列的值相同的记录将按后续列的排序方向排序。
  • 可以根据需要添加多个 addOrderBy 语句或 ORDER BY 子句来按更多列排序。
  • 默认情况下,按升序排序。要按降序排序,请指定 DESC 作为排序方向。

示例代码

$em = $this->getDoctrine()->getManager();

$qb = $em->createQueryBuilder();

$qb->select('r')
    ->from('MyEntity', 'r')
    ->orderBy('r.firstColumn', 'ASC')
    ->addOrderBy('r.secondColumn', 'DESC')
    ->addOrderBy('r.thirdColumn', 'ASC');

$results = $qb->getQuery()->getResult();

常见问题解答

1. 如何按第一列值相同的情况下,按第二列升序排序?

$qb->select('r')
    ->from('MyEntity', 'r')
    ->orderBy('r.firstColumn')
    ->addOrderBy('r.secondColumn', 'ASC');

2. 如何按第一列值相同的情况下,按第二列和第三列降序排序?

$qb->select('r')
    ->from('MyEntity', 'r')
    ->orderBy('r.firstColumn')
    ->addOrderBy('r.secondColumn', 'DESC')
    ->addOrderBy('r.thirdColumn', 'DESC');

3. 如何使用 DQL 在查询中指定多个排序条件?

SELECT r
FROM MyEntity r
ORDER BY r.firstColumn ASC, r.secondColumn DESC, r.thirdColumn ASC

4. Doctrine 是否支持按多列排序时使用 NULLS FIRSTNULLS LAST

是的,可以通过在 orderByaddOrderBy 语句中指定 NULLS FIRSTNULLS LAST 来实现。例如:

$qb->select('r')
    ->from('MyEntity', 'r')
    ->orderBy('r.firstColumn', 'ASC')
    ->addOrderBy('r.secondColumn', 'DESC', true); // NULLS LAST

5. 如何按多个关联实体的字段排序?

可以利用 Doctrine 的联接查询功能来实现按多个关联实体的字段排序。例如:

$qb->select('r')
    ->from('MyEntity', 'r')
    ->leftJoin('r.relatedEntity', 're')
    ->orderBy('re.firstColumn', 'ASC')
    ->addOrderBy('re.secondColumn', 'DESC');