Diurutkan berdasarkan banyak kolom dengan Ajaran

115

Saya perlu mengurutkan data dengan dua kolom (ketika baris memiliki nilai yang berbeda untuk kolom nomor 1, urutkan berdasarkan itu; jika tidak, urutkan berdasarkan kolom nomor 2)

Saya menggunakan a QueryBuilderuntuk membuat kueri.

Jika saya memanggil orderBymetode ini untuk kedua kalinya, itu menggantikan urutan yang ditentukan sebelumnya.

Saya bisa melewatkan dua kolom sebagai parameter pertama:

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

Tetapi saya tidak dapat melewatkan dua arah pengurutan untuk parameter kedua, jadi ketika saya menjalankan kueri ini, kolom pertama diurutkan dalam arah menaik dan yang kedua, menurun. Saya ingin menggunakan turunan untuk keduanya.

Apakah ada cara untuk melakukan ini dengan menggunakan QueryBuilder? Apakah saya perlu menggunakan DQL?

zootropo
sumber

Jawaban:

213

Anda harus menambahkan arah pesanan tepat setelah nama kolom:

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

Seperti yang telah Anda catat, beberapa panggilan ke orderBy tidak ditumpuk , tetapi Anda dapat membuat beberapa panggilan ke addOrderBy:

$qb->addOrderBy('column1', 'ASC')
   ->addOrderBy('column2', 'DESC');
Diego Agulló
sumber
2
Terima kasih. saya tidak memperhatikan ini sebelumnya. Saya pikir dua pernyataan orderBy ok untuk ini. jadi saya tidak menyadari metode addOrderBy. sorak-sorai untuk menunjukkannya :)
Diego Agulló: Sayangnya, kedua tautan dalam jawaban Anda tidak berfungsi lagi.
k00ni
1
@ k00ni terima kasih telah menunjukkan hal ini. Saya memperbarui yang pertama ke dokumen terbaru, tetapi saya tidak dapat menemukan masalah yang dimigrasi DC-909 di GitHub, jadi saya menghapus yang terakhir.
Diego Agulló
Untuk pembuat kueri dengan alias tabel, jangan lupa tambahkan alias.column_name.
Maulik Parmar
16

Dalam Doctrine 2.x Anda tidak dapat mengirimkan banyak urutan dengan menggunakan doktrin 'orderBy' atau 'addOrderBy' seperti contoh di atas. Karena, ini secara otomatis menambahkan 'ASC' di akhir nama kolom terakhir saat Anda mengosongkan parameter kedua, seperti di fungsi 'orderBy'.

Sebagai contoh ->orderBy('a.fist_name ASC, a.last_name ASC')akan menampilkan SQL seperti ini 'ORDER BY first_name ASC, last_name ASC ASC'. Jadi ini adalah kesalahan sintaks SQL. Hanya karena default dari orderBy atau addOrderBy adalah 'ASC'.

Untuk menambahkan beberapa pesanan, Anda perlu menggunakan fungsi 'tambah'. Dan akan seperti ini.

->add('orderBy','first_name ASC, last_name ASC'). Ini akan memberi Anda SQL yang diformat dengan benar.

Info lebih lanjut tentang fungsi add (). https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api

Semoga ini membantu. Bersulang!

Anjana Silva
sumber
8

kamu bisa memakai ->addOrderBy($sort, $order)

Tambahkan: Doctrine Querybuilder btw. sering menggunakan "khusus" modifikasi metode normal, lihat select-addSelect, where-andWhere-orWhere, groupBy-addgroupBy...

Christian Huber
sumber
0

The komentar untuk orderBycatatan kode sumber: Keys are field and values are the order, being either ASC or DESC.. Jadi Anda bisa melakukannya orderBy->(['field' => Criteria::ASC]).

Victor S
sumber
Ini tidak benar. Lihat jawaban saya di atas
Thomas Hansen
0

The orderByMetode membutuhkan baik dua string atau Expr\OrderByobjek. Jika Anda ingin menambahkan beberapa deklarasi pesanan, hal yang benar adalah menggunakan addOrderBymetode, atau membuat instance OrderByobjek dan mengisinya sesuai:

   # 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)
   ;
Thomas Hansen
sumber