查询生成器中的多个 Order By 语句?

Posted

技术标签:

【中文标题】查询生成器中的多个 Order By 语句?【英文标题】:Multiple Order By Statements in Query Builder? 【发布时间】:2018-01-29 19:52:03 【问题描述】:

我有一个 Symfony 3 项目。我正在向查询生成器发送一个不同长度的数组。查询生成器如下所示:

function findByQuery($sortBy) 
    return $this->createQueryBuilder('d')
                    ->leftJoin('d.cat', 'dc')
                    ->leftJoin('d.dog', 'dd')
                    ->leftJoin('d.rabbit', 'rr')
                    ->getQuery()
                    ->execute();


我想使用 $sortBy 参数对结果进行排序。但是问题是,有时 $sortBy(它是一个数组)有时只包含一个带有键和设置顺序的元素(例如 ASC 或 DESC),而其他时候将包含多个键。无论哪种情况,我都希望能够按所有元素对结果进行排序。有没有一种简单的方法可以做到这一点?

非常感谢,

【问题讨论】:

您可以在调用getQuery()之前将QueryBuilder实例分配给一个变量,然后使用简单的foreach(),您可以根据需要多次调用addOrderBy()方法,并且最后返回类似$builder->getQuery()->execute() 抱歉,我不完全理解如何使用 addOrderBy 方法做到这一点? 【参考方案1】:

这很简单:

$sortBy = [
    'd.property1'  => 'ASC',
    'd.property2'  => 'DESC'
];

function findByQuery(array $sortBy) 
    // create QueryBuilder
    $qb = $this->createQueryBuilder('d')
        ->leftJoin('d.cat', 'dc')
        ->leftJoin('d.dog', 'dd')
        ->leftJoin('d.rabbit', 'rr');

    foreach ($sortBy as $property => $dir) 
        $qb->addOrderBy($property, $dir);
    

    return $qb->getQuery()
        ->execute();

【讨论】:

可能数组键需要与表别名如d.property1

以上是关于查询生成器中的多个 Order By 语句?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 查询生成器 order by 不适用于左连接

若SQL语句中的ORDER BY短语中指定了多个字段,则( )。

若sql语句中order by指定了多个字段,则怎么排序?

使用DISTINCT时,LINQ to SQL不生成ORDER BY?

如何在 select 语句中包含 PERCENTILE_CONT 列,而不会生成有关 ORDER BY 子句或聚合函数的错误?

若sql语句中order by指定了多个字段,则怎么排序?