Laravel Eloquent: Memesan hasil semua ()


214

Saya terjebak pada tugas sederhana. Saya hanya perlu memesan hasil yang datang dari panggilan ini

$results = Project::all();

Di mana Projectseorang model. Saya sudah mencoba ini

$results = Project::all()->orderBy("name");

Tapi itu tidak berhasil. Mana cara yang lebih baik untuk mendapatkan semua data dari sebuah tabel dan membuatnya dipesan?

Jawaban:



114

Anda masih bisa menggunakan sortBy (di tingkat koleksi) alih-alih orderBy (di tingkat permintaan) jika Anda masih ingin menggunakan semua () karena mengembalikan koleksi objek.

Urutan Naik

$results = Project::all()->sortBy("name");

Urutan Turun

$results = Project::all()->sortByDesc("name");

Lihat dokumentasi tentang Koleksi untuk lebih jelasnya.

https://laravel.com/docs/5.1/collections


Persis apa yang saya cari. Apakah penggunaan ekstensif ini akan memiliki kelemahan dibandingkan dengan menggunakan orderBypada tingkat permintaan?
Giedrius

1
\ @foreach ($ posts-> sortByDesc ('Created_at') sebagai $ post) \ @include ('posts.post') \ @endforeach
sdexp

2
Saya tertarik mengetahui bagaimana ini bekerja di belakang layar. Saya merasa seolah-olah menyortir koleksi dengan yang sortBy()terjadi di dalam Laravel Engine (dalam PHP), sementara orderBy()itu dilakukan dalam database. Tentunya basis data akan lebih cepat di hampir semua situasi yang mungkin, dan dengan bertambahnya set data Anda, perbedaan kinerja juga akan semakin besar. Saya ingin mendengar pendapat orang lain tentang ini.
cartbeforehorse

3
@cartbeforehorse Anda perlu tahu metode mana mengembalikan apa. :: all () mungkin hanya memanggil -> get () di bawah tenda, yang, pada gilirannya, mengembalikan koleksi. sortBy () adalah metode koleksi, jadi ya itu terjadi di sisi PHP (sebagai lawan dari orderBy () yang dipanggil pada objek permintaan). Merupakan ide yang buruk untuk menggunakan :: all () sama sekali, apalagi mengurutkannya dalam PHP. Bayangkan jika :: all () mengembalikan koleksi dengan jutaan objek. Akan terlalu lama untuk mengambilnya dan bahkan lebih banyak waktu untuk mengurutkannya dalam PHP. Tentu saja, Anda dapat menggunakan :: all () jika Anda tahu pasti itu akan mengembalikan hanya beberapa objek (dalam koleksi).
Avram

mengapa yang ini bukan jawaban yang diterima? ini bekerja dengan semua fungsi ().
VishalParkash

36

Selain itu, hanya untuk menopang jawaban sebelumnya, bisa juga disortir dalam urutan menurun descatau naik ascdengan menambahkan parameter kedua.

$results = Project::orderBy('created_at', 'desc')->get();

14

Pembaruan 2017


Laravel 5.4 menambahkan metode orderByDesc () ke pembuat kueri:

$results = Project::orderByDesc('name')->get();

10

Meskipun Anda perlu hasil untuk tanggal sebagai desc

$results = Project::latest('created_at')->get();

9

MELAKUKAN HAL INI:

$results = Project::orderBy('name')->get();

JANGAN LAKUKAN INI:

$results = Project::all()->sortBy('name');

MENGAPA? Secara singkat, pendekatan pertama lebih cepat dari pendekatan kedua.


3
Akan lebih baik untuk menambahkan penjelasan mengapa: Pendekatan pertama membuat urutan pada tingkat basis data (permintaan) yang hampir selalu jauh lebih efisien - kinerja terbaik. Saya akan mengatakan menggunakan pendekatan Model selalu, ketika Anda akan membutuhkan pendekatan kedua, Anda akan tahu :)
jave.web


4

Catatan, Anda bisa melakukan:

$results = Project::select('name')->orderBy('name')->get();

Ini menghasilkan permintaan seperti:

"SELECT name FROM proyect ORDER BY 'name' ASC"

Di beberapa aplikasi ketika DB tidak dioptimalkan dan kueri lebih kompleks, dan Anda perlu mencegah menghasilkan ORDER OLEH di SQL selesai, Anda dapat melakukan:

$result = Project::select('name')->get();
$result = $result->sortBy('name');
$result = $result->values()->all();

Sekarang adalah php yang memesan hasilnya.


0

Instruksi Anda memerlukan panggilan untuk mendapatkan, karena itu membawa catatan dan memesan oleh katalog

$results = Project::orderBy('name')
           ->get();

Contoh:

$results = Result::where ('id', '>=', '20')
->orderBy('id', 'desc')
->get();

Dalam contoh data disaring oleh "di mana" dan membawa catatan lebih besar dari 20 dan memesan dengan pesanan dari tinggi ke rendah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.