Ларавел Красномовний: Замовлення результатів усіх ()


214

Я застряг у простому завданні. Мені просто потрібно замовити результати, отримані від цього дзвінка

$results = Project::all();

Де Projectмодель. Я спробував це

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

Але це не спрацювало. Який кращий спосіб отримати всі дані з таблиці та впорядкувати їх?

Відповіді:



114

Ви все ще можете використовувати sortBy (на рівні колекції) замість orderBy (на рівні запиту), якщо ви все ще хочете використовувати all (), оскільки він повертає колекцію об'єктів.

В порядку зростання

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

У порядку зменшення

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

Перегляньте документацію про колекції для отримання більш детальної інформації.

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


Саме те, що я шукав. Чи може широкомасштабне використання цього мати якісь недоліки порівняно з використанням orderByна рівні запитів?
Гедрій

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

2
Мені цікаво знати, як це працює за лаштунками. Мені здається, що сортування колекції sortBy()відбувається за допомогою Laravel Engine (в PHP), тоді як orderBy()це робиться в базі даних. Безумовно, база даних буде швидшою у майже всіх можливих ситуаціях, і коли ваш набір даних збільшуватиметься, така різниця у продуктивності. Я хотів би почути з цього приводу чужі думки.
cartbeforehorse

3
@cartbeforehorse Потрібно знати, який метод повертає що. :: all (), ймовірно, просто дзвонить -> get () під кришку, яка, у свою чергу, повертає колекцію. sortBy () - метод колекції, тому так це відбувається на стороні PHP (на відміну від orderBy (), який викликається об'єктом запиту). Дуже погано використовувати :: all () взагалі, не кажучи вже про сортування в PHP. Уявіть собі, якщо :: all () повертає колекцію з мільйоном об’єктів. Це займе занадто багато часу, щоб отримати його і ще більше часу, щоб сортувати його в PHP. Звичайно, ви можете використовувати :: all (), якщо точно знаєте, що він поверне лише кілька об’єктів (у колекції).
Аврам

чому це не є прийнятою відповіддю? він працював з функцією all ().
VishalParkash

36

Крім того, для підтвердження колишніх відповідей це можна було б також сортувати або за низхідним, descабо за зростанням asc, додаючи або як другий параметр.

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

14

Оновлення 2017 року


Laravel 5.4 додав методи orderByDesc () до запиту будівельника:

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

10

Хоча вам потрібен результат для дати, як опис

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

9

ЗРОБИТИ ЦЕ:

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

НЕ робіть цього:

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

ЧОМУ? Якщо коротко, перший підхід швидший, ніж другий.


3
Було б непогано додати пояснення, чому: Перший підхід наводить порядок на рівні бази даних (запитів), що майже завжди набагато ефективніше - найкраща ефективність. Я б сказав, використовуйте Типовий підхід завжди, коли вам знадобиться другий підхід, ви знаєте :)
jave.web


4

Зауважте, що ви можете:

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

Це генерує запит на зразок:

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

У деяких додатках, коли БД не оптимізована, а запит складніший, і вам потрібно не допустити генерування ORDER BY у SQL фінішу, ви можете:

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

Тепер PHP замовляє результат.


0

Ви інструкція вимагає дзвінка, щоб отримати, тому що це приносить записи і замовляє каталог

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

Приклад:

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

У прикладі дані фільтруються «де» та приносять записи, що перевищують 20, та каталог OrderBy на замовлення від високого до низького.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.