Doctrineで複数の列で並べ替え


115

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

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

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

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

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

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

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

回答:


213

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

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

お気づきのように、への複数の呼び出しorderBy はスタックませんが、への複数の呼び出しを行うことができますaddOrderBy

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

2
ありがとう。以前は気づかなかった。これには2つのorderByステートメントで問題ないと思いました。そのため、私はaddOrderByメソッドを認識していませんでした。:)それを指摘して歓声

DiegoAgulló:残念ながら、回答の両方のリンクが機能しなくなっています。
k00ni

1
@ k00niこれを指摘してくれてありがとう。前者を最新のドキュメントに更新しましたが、GitHubに移行した問題DC-909が見つからなかったため、後者を削除しました。
DiegoAgulló19年

テーブルエイリアスを持つクエリビルダーの場合、を追加することを忘れないでくださいalias.column_name
Maulik Parmar

16

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

たとえば、->orderBy('a.fist_name ASC, a.last_name ASC')次のようなSQLを出力します '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

お役に立てれば。乾杯!


8

あなたは使うことができます ->addOrderBy($sort, $order)

追加:Doctrine Querybuilder btw。多くの場合、通常の方法の「特別な」変更を使用して、参照select-addSelectwhere-andWhere-orWheregroupBy-addgroupBy...


0

orderByソースコードノートのコメント:Keys are field and values are the order, being either ASC or DESC.。そうすることができますorderBy->(['field' => Criteria::ASC])


これは正しくありません。上記の私の答えを参照してください
トーマスハンセン

0

このorderByメソッドには、2つの文字列またはExpr\OrderByオブジェクトが必要です。複数の注文宣言を追加したい場合、正しいことはaddOrderByメソッドするか、OrderByオブジェクトをインスタンス化してそれに応じて入力することです。

   # Inside a Repository method:
   $myResults = $this->createQueryBuilder('a')
       ->addOrderBy('a.column1', 'ASC')
       ->addOrderBy('a.column2', 'ASC')
       ->addOrderBy('a.column3', 'DESC')
   ;

   # Or, using a OrderBy object:
   $orderBy = new OrderBy('a.column1', 'ASC');
   $orderBy->add('a.column2', 'ASC');
   $orderBy->add('a.column3', 'DESC');

   $myResults = $this->createQueryBuilder('a')
       ->orderBy($orderBy)
   ;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.