通过与学说多列订单(Order by multiple columns with Doctrine)

2019-06-26 10:38发布

我需要两列命令数据时(当行具有对列号1,为了通过它不同的值;否则,为了通过列号2)

我使用QueryBuilder创建查询。

如果我调用orderBy方法的第二次,它取代了以前指定的任何排序。

我可以通过两列作为第一个参数:

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

但我不能传递两个方向排序为第二个参数,所以,当我执行此查询的第一列是在上升的方向,第二个,降有序。 我想用降对他们俩的。

有没有办法做到这一点使用QueryBuilder ? 我是否需要使用DQL?

Answer 1:

你有列名之后的顺序方向地址:

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

正如你所指出的那样,多次调用orderBy 不叠加 ,但你可以在多个电话addOrderBy

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


Answer 2:

在教义2.X你无法通过使用教义“ORDERBY”或“addOrderBy”如上述例子传递多个顺序。 因为,它会自动当你离开的第二个参数为空,如在“排序依据”功能中增加“ASC”在最后一列名的末尾。

举一个例子->orderBy('a.fist_name ASC, a.last_name ASC')将输出SQL这样的事情'ORDER BY FIRST_NAME ASC,姓氏ASC ASC'。 因此,这是SQL语法错误。 很简单,因为在排序依据或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

希望这可以帮助。 干杯!



Answer 3:

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

地址:学说QueryBuilder的BTW。 经常使用的常规方法“特殊”的修改,请select-addSelectwhere-andWhere-orWheregroupBy-addgroupBy ...



Answer 4:

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



文章来源: Order by multiple columns with Doctrine