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 QueryBuilder
untuk membuat kueri.
Jika saya memanggil orderBy
metode 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?
sumber
alias.column_name
.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!
sumber
kamu bisa memakai
->addOrderBy($sort, $order)
Tambahkan: Doctrine Querybuilder btw. sering menggunakan "khusus" modifikasi metode normal, lihat
select-addSelect
,where-andWhere-orWhere
,groupBy-addgroupBy
...sumber
The komentar untuk
orderBy
catatan kode sumber:Keys are field and values are the order, being either ASC or DESC.
. Jadi Anda bisa melakukannyaorderBy->(['field' => Criteria::ASC])
.sumber
The
orderBy
Metode membutuhkan baik dua string atauExpr\OrderBy
objek. Jika Anda ingin menambahkan beberapa deklarasi pesanan, hal yang benar adalah menggunakanaddOrderBy
metode, atau membuat instanceOrderBy
objek dan mengisinya sesuai:sumber