web-dev-qa-db-ja.com

Doctrineを使用して複数の列で並べ替えます

データを2列で並べ替える必要があります(行の列番号1の値が異なる場合は並べ替え、それ以外の場合は列番号2で並べ替え)

QueryBuilderを使用してクエリを作成しています。

orderByメソッドをもう一度呼び出すと、以前に指定された順序が置き換えられます。

最初のパラメーターとして2つの列を渡すことができます。

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

しかし、2番目のパラメーターに2つの順序方向を渡すことはできないため、このクエリを実行すると、最初の列は昇順で、2番目の列は降順で順序付けられます。両方に降順を使用したいと思います。

QueryBuilderを使用してこれを行う方法はありますか? DQLを使用する必要がありますか?

102
zootropo

列名の直後に順序の方向を追加する必要があります。

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

既に述べたように、orderByへの複数の呼び出し スタックしない ですが、 addOrderBy への複数の呼び出しを行うことができます。

$qb->addOrderBy('column1', 'ASC')
   ->addOrderBy('column2', 'DESC');
194
Diego Agulló

Doctrine 2.xでは、上記の例のようにdoctrine 'orderBy'または 'addOrderBy'を使用して複数の注文を渡すことはできません。なぜなら、「orderBy」関数などで2番目のパラメーターを空白のままにすると、最後の列名の最後に「ASC」が自動的に追加されるためです。

たとえば、->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

お役に立てれば。乾杯!

15
Anjana Silva

->addOrderBy($sort, $order)を使用できます

追加:Doctrine Querybuilder btw。多くの場合、通常のメソッドの「特別な」変更を使用します。select-addSelectwhere-andWhere-orWheregroupBy-addgroupBy...を参照してください。

7
Christian Huber

orderByソースコードに関するコメント:Keys are field and values are the order, being either ASC or DESC.。したがって、orderBy->(['field' => Criteria::ASC])を実行できます。

1
Victor S