我需要按两列排序数据(当行具有不同的列号1的值时,按顺序排序;否则,按列号2排序)
我正在使用 QueryBuilder
来创建查询 .
如果我第二次调用 orderBy
方法,它将替换之前指定的任何排序 .
我可以传递两列作为第一个参数:
->orderBy('r.firstColumn, r.secondColumn', 'DESC');
但我无法为第二个参数传递两个排序方向,因此当我执行此查询时,第一列按升序排序,第二列按降序排序 . 我想对他们两个使用降序 .
有没有办法使用 QueryBuilder
?我需要使用DQL吗?
4 回答
您必须在列名称后面添加订单方向:
如您所述,多次调用
orderBy
do not stack,但您可以多次调用addOrderBy:在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
希望这可以帮助 . 干杯!
你可以用
->addOrderBy($sort, $order)
添加:Doctrine Querybuilder btw . 经常使用正常方法的"special"修改,参见
select-addSelect
,where-andWhere-orWhere
,groupBy-addgroupBy
...orderBy
源代码注释的注释:Keys are field and values are the order, being either ASC or DESC.
. 所以你可以做orderBy->(['field' => Criteria::ASC])
.