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?

MatterGoal
fonte

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

Yannick Y
fonte
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();
ken4ward
fonte
14

2017 update


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

$results = Project::orderByDesc('name')->get();
Sebastien Horin
fonte
10

Enquanto você precisar de resultado para a data como desc

$results = Project::latest('created_at')->get();
DsRaj
fonte
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.

doncadavona
fonte
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.

hkcoyant
fonte
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.

Vhngroup Tecnologia
fonte