Laravel Eloquent: Porządkowanie wyników wszystkich ()

214

Utknąłem na prostym zadaniu. Muszę tylko zamówić wyniki pochodzące z tego połączenia

$results = Project::all();

Gdzie Projectjest model. Próbowałem tego

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

Ale to nie zadziałało. Jaki jest lepszy sposób na uzyskanie wszystkich danych z tabeli i zamówienie ich?

MatterGoal
źródło

Odpowiedzi:

114

Nadal możesz użyć sortBy (na poziomie kolekcji) zamiast orderBy (na poziomie zapytania), jeśli nadal chcesz używać all (), ponieważ zwraca kolekcję obiektów.

Rosnąco

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

Kolejność malejąca

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

Więcej informacji można znaleźć w dokumentacji dotyczącej kolekcji.

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

Yannick Y
źródło
Dokładnie tego szukałem. Czy szerokie zastosowanie tego miałoby jakieś wady w porównaniu do używania orderByna poziomie zapytania?
Giedrius
1
\ @foreach ($ posts-> sortByDesc ('Created_at') jako $ post) \ @include ('posts.post') \ @endforeach
sdexp 23.04.17
2
Chcę wiedzieć, jak to działa za kulisami. Uderza mnie to, jakby sortowanie kolekcji sortBy()odbywa się wewnątrz silnika Laravel (w PHP), podczas gdy orderBy()odbywa się to w bazie danych. Z pewnością baza danych będzie szybsza w prawie wszystkich możliwych sytuacjach, a wraz ze wzrostem zestawu danych zwiększy się różnica w wydajności. Chciałbym usłyszeć opinie innych ludzi na ten temat.
cartbeforehorse
3
@cartbeforehorse Musisz wiedzieć, która metoda zwraca co. :: all () prawdopodobnie po prostu wywołuje -> get () pod maską, co z kolei zwraca kolekcję. sortBy () jest metodą kolekcji, więc tak dzieje się po stronie PHP (w przeciwieństwie do orderBy (), która jest wywoływana w obiekcie zapytania). Nie jest dobrym pomysłem korzystanie z :: all (), nie mówiąc już o sortowaniu w PHP. Wyobraź sobie, że :: :: () zwraca kolekcję z milionem obiektów. Pobieranie go potrwa zbyt długo, a jeszcze więcej czasu zajmuje sortowanie go w PHP. Oczywiście możesz użyć :: all (), jeśli wiesz na pewno, że zwróci tylko garść obiektów (w kolekcji).
Avram
dlaczego to nie jest zaakceptowana odpowiedź? działało z funkcją all ().
VishalParkash
36

Ponadto, aby podeprzeć poprzednie odpowiedzi, można je również posortować w porządku malejącym desclub rosnącym asc, dodając jeden z nich jako drugi parametr.

$results = Project::orderBy('created_at', 'desc')->get();
ken4ward
źródło
14

Aktualizacja 2017


Laravel 5.4 dodał metody orderByDesc () do konstruktora zapytań:

$results = Project::orderByDesc('name')->get();
Sebastien Horin
źródło
10

Podczas gdy potrzebujesz wyniku dla daty jako opisu

$results = Project::latest('created_at')->get();
DsRaj
źródło
9

ZRÓB TO:

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

NIE RÓB TO:

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

CZEMU? W skrócie, pierwsze podejście jest szybsze niż drugie podejście.

doncadavona
źródło
3
Dobrze byłoby dodać wyjaśnienie, dlaczego: Pierwsze podejście sprawia, że ​​porządek na poziomie bazy danych (zapytania) jest prawie zawsze znacznie bardziej wydajny - najlepsza wydajność. Powiedziałbym, że zawsze używaj podejścia modelowego, kiedy będziesz potrzebować drugiego podejścia, będziesz wiedział :)
jave.web
4

Uwaga: możesz zrobić:

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

To generuje zapytanie takie jak:

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

W niektórych aplikacjach, gdy baza danych nie jest zoptymalizowana, a zapytanie jest bardziej złożone, i trzeba uniemożliwić wygenerowanie ORDER BY w końcowym SQL, możesz:

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

Teraz jest php, który zamawia wynik.

hkcoyant
źródło
0

Twoja instrukcja wymaga połączenia, aby uzyskać, ponieważ jest to przynieść rekordy i zamówić przez katalog

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

Przykład:

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

W tym przykładzie dane są filtrowane według „gdzie” i przynoszą rekordy większe niż 20, a katalog sortuje według kolejności od wysokiej do niskiej.

Vhngroup Tecnologia
źródło