Laravel Eloquent: Ordenando resultados de todos ()


214

Estou preso em uma tarefa simples. Eu só preciso pedir os resultados dessa ligação

$results = Project::all();

Onde Projectestá um modelo. Eu tentei isso

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

Mas não deu certo. Qual é a melhor maneira de obter todos os dados de uma tabela e ordená-los?

Respostas:



114

Você ainda pode usar sortBy (no nível da coleção) em vez de orderBy (no nível da consulta) se ainda quiser usar all (), pois ele retorna uma coleção de objetos.

Ordem ascendente

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

Ordem decrescente

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

Confira a documentação sobre coleções para obter mais detalhes.

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


Exatamente o que eu estava procurando. O uso extensivo disso tem algumas desvantagens em comparação com o uso orderByno nível da consulta?
Giedrius

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

2
Estou interessado em saber como isso funciona nos bastidores. Parece-me que classificar a coleção sortBy()acontece dentro do Laravel Engine (em PHP), enquanto isso orderBy()é feito no banco de dados. Certamente, o banco de dados será mais rápido em quase todas as situações concebíveis e, à medida que seu conjunto de dados aumentar, aumentará a disparidade no desempenho. Eu adoraria ouvir os pensamentos de outras pessoas sobre isso.
cartbeforehorse

3
@cartbeforehorse Você precisa saber qual método retorna o quê. :: all () provavelmente apenas chama -> get () sob o capô, que, por sua vez, retorna uma coleção. sortBy () é um método de uma coleção; portanto, isso acontece no lado do PHP (ao contrário de orderBy (), que é chamado em um objeto de consulta). É uma má idéia usar :: all (), muito menos classificá-lo em PHP. Imagine se :: all () retornar uma coleção com um milhão de objetos. Levará muito tempo para buscá-lo e ainda mais tempo para classificá-lo em PHP. Obviamente, você pode usar :: all () se tiver certeza de que retornará apenas alguns objetos (em uma coleção).
Avram

por que essa não é a resposta aceita? funcionou com a função all ().
VishalParkash 17/02

36

Além disso, apenas para reforçar as respostas anteriores, ela também pode ser classificada em ordem desccrescente ou decrescente asc, adicionando o segundo parâmetro.

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

14

2017 update


O Laravel 5.4 adicionou métodos orderByDesc () ao query builder:

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

10

Enquanto você precisar de resultado para a data como desc

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

9

FAÇA ISSO:

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

NÃO FAÇA ISTO:

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

PORQUE? Resumidamente, a primeira abordagem é mais rápida que a segunda.


3
Seria bom acrescentar uma explicação do motivo: a primeira abordagem faz a ordem no nível do banco de dados (consulta) quase sempre muito mais eficiente - o melhor desempenho. Eu diria que o uso abordagem Modelo sempre, quando você vai precisar da segunda abordagem, você vai saber :)
jave.web


4

Observe que você pode fazer:

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

Isso gera uma consulta como:

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

Em alguns aplicativos quando o banco de dados não é otimizado e a consulta é mais complexa, e você precisa impedir a geração de um ORDER BY no SQL final, você pode:

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

Agora é php quem pede o resultado.


0

Você precisa de instruções para receber, porque é trazer os registros e encomendar

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

Exemplo:

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

No exemplo, os dados são filtrados por "where" e trazem registros maiores que 20 e orderBy catalogam por ordem de alto a baixo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.