Laravel Eloquent: Ordinare i risultati di tutti ()


215

Sono bloccato su un compito semplice. Devo solo ordinare i risultati di questa chiamata

$results = Project::all();

Dov'è Projectun modello. Ci ho provato

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

Ma non ha funzionato. Qual è il modo migliore per ottenere tutti i dati da una tabella e ordinarli?

Risposte:



114

È comunque possibile utilizzare sortBy (a livello di raccolta) anziché orderBy (a livello di query) se si desidera ancora utilizzare all () poiché restituisce una raccolta di oggetti.

Ordine ascendente

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

Ordine decrescente

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

Consulta la documentazione sulle Collezioni per maggiori dettagli.

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


Esattamente quello che stavo cercando. Un ampio uso di questo avrebbe degli svantaggi rispetto all'utilizzo orderBya livello di query?
Giedrius,

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

2
Sono interessato a sapere come funziona dietro le quinte. Mi sortBy()sembra che l'ordinamento della raccolta avvenga all'interno del Laravel Engine (in PHP), mentre il processo orderBy()viene eseguito nel database. Sicuramente il database sarà più veloce in quasi tutte le situazioni immaginabili e con l'aumentare del set di dati aumenterà anche la disparità nelle prestazioni. Mi piacerebbe sentire i pensieri degli altri su questo.
cartbeforehorse,

3
@cartbeforehorse Devi sapere quale metodo restituisce cosa. :: all () probabilmente chiama semplicemente -> get () sotto il cofano, che, a sua volta, restituisce una raccolta. sortBy () è un metodo di una raccolta, quindi sì succede sul lato PHP (al contrario di orderBy () che viene chiamato su un oggetto query). È una cattiva idea usare :: all (), per non parlare dell'ordinamento in PHP. Immagina se :: all () restituisce una raccolta con un milione di oggetti. Ci vorrà troppo tempo per recuperarlo e ancora più tempo per ordinarlo in PHP. Ovviamente, puoi usare :: all () se sai con certezza che restituirà solo una manciata di oggetti (in una raccolta).
Avram,

perché questa non è la risposta accettata? ha funzionato con la funzione all ().
VishalParkash,

36

Inoltre, solo per sostenere le risposte precedenti, è possibile ordinarle anche in ordine decrescente desco crescente ascaggiungendo come secondo parametro.

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

14

Aggiornamento 2017


Laravel 5.4 ha aggiunto i metodi orderByDesc () al generatore di query:

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

10

Mentre hai bisogno di risultati per la data come desc

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

9

FAI QUESTO:

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

NON FARE QUESTO:

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

PERCHÉ? In breve, il primo approccio è più veloce del secondo approccio.


3
Sarebbe bello aggiungere una spiegazione del perché: il primo approccio rende l'ordine a livello di database (query) che è quasi sempre molto più efficiente: le migliori prestazioni. Direi che usi sempre l'approccio Model, quando avrai bisogno del secondo approccio, lo saprai :)
jave.web


4

Nota, puoi fare:

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

Questo genera una query come:

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

In alcune app quando il DB non è ottimizzato e la query è più complessa ed è necessario impedire la generazione di un ORDER BY nel codice SQL finale, è possibile eseguire:

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

Ora è php che ordina il risultato.


0

Le istruzioni richiedono una chiamata per ottenere, perché porta i record e ordina dal catalogo

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

Esempio:

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

Nell'esempio i dati vengono filtrati per "dove" e portano i record maggiori di 20 e ordina dal catalogo in ordine crescente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.