使用 Doctrine 按多列排序

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

我使用 QueryBuilder来创建查询。

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

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

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

但是我不能为第二个参数传递两个排序方向,所以当我执行这个查询时,第一列的排序方向是升序,第二列的排序方向是降序。我想对它们都使用降序。

是否有使用 QueryBuilder的方法? 我需要使用 DQL 吗?

130925 次浏览

必须在列名之后添加订单方向:

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

正如您所注意到的,对 orderBy 不要堆叠的多次呼叫,但是您可以对 addOrderBy进行多次呼叫:

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

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

添加: 教条查询生成器经常使用“特殊”修改的正常方法,见 select-addSelectwhere-andWhere-orWheregroupBy-addgroupBy..。

在 Doctrine 2.x 中,你不能像上面的例子一样使用‘ 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”。

要添加多个订单的,你需要使用’添加’的功能。它将是这样的。

这将为您提供正确格式化的 SQL。

关于 add ()函数的更多信息

希望这个能帮上忙,干杯!

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

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)
;

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

例如:

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