zoo*_*opo 104 php doctrine sql-order-by
我需要按两列排序数据(当行具有不同的列号1的值时,按顺序排序;否则,按列号2排序)
我正在使用a QueryBuilder
来创建查询.
如果我orderBy
第二次调用该方法,它将替换之前指定的任何排序.
我可以传递两列作为第一个参数:
->orderBy('r.firstColumn, r.secondColumn', 'DESC');
Run Code Online (Sandbox Code Playgroud)
但我无法为第二个参数传递两个排序方向,因此当我执行此查询时,第一列按升序排序,第二列按降序排序.我想对他们两个使用降序.
有没有办法使用QueryBuilder
?我需要使用DQL吗?
Die*_*lló 198
您必须在列名称后面添加订单方向:
$qb->orderBy('column1 ASC, column2 DESC');
Run Code Online (Sandbox Code Playgroud)
正如您所指出的,多次调用orderBy
不会堆叠,但您可以多次调用addOrderBy
:
$qb->addOrderBy('column1', 'ASC')
->addOrderBy('column2', 'DESC');
Run Code Online (Sandbox Code Playgroud)
Anj*_*lva 15
在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.所以这是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
希望这可以帮助.干杯!
小智 10
您可以使用 orderBy() 后跟 addOrderBy() - 嵌套多个 orderBy() 是不可能的,但在初始 orderBy() 之后嵌套多个 addOrderBy() 也可以。
例子:
$this->createQueryBuilder('entity')
->orderBy('entity.addDate', 'DESC')
->addOrderBy('entity.id', 'DESC')
Run Code Online (Sandbox Code Playgroud)
您可以使用 ->addOrderBy($sort, $order)
添加:Doctrine Querybuilder btw.经常使用的常规方法"特殊"的修改,见select-addSelect
,where-andWhere-orWhere
,groupBy-addgroupBy
...