Laravel Eloquent: результаты заказа всех ()


215

Я застрял на простом задании. Мне просто нужно заказать результаты этого звонка

$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 ('созданный_кат') как $ post) \ @include ('posts.post') \ @endforeach
sdexp

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

3
@cartbeforehorse Вам нужно знать, какой метод что возвращает. :: all (), вероятно, просто вызывает -> get () изнутри, что, в свою очередь, возвращает коллекцию. sortBy () - это метод коллекции, так что да, это происходит на стороне PHP (в отличие от orderBy (), который вызывается для объекта запроса). Плохо вообще использовать :: all (), не говоря уже о сортировке в PHP. Представьте, что если :: all () возвращает коллекцию с миллионом объектов. Для его извлечения потребуется слишком много времени и еще больше времени для его сортировки в PHP. Конечно, вы можете использовать :: all (), если вы точно знаете, что он вернет только несколько объектов (в коллекции).
Аврам

почему этот ответ не принят? это работало с функцией all ().
ВишалПаркаш

36

Кроме того, просто чтобы поддержать прежние ответы, его можно отсортировать либо по убыванию, descлибо по возрастанию asc, добавив либо в качестве второго параметра.

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

14

Обновление 2017


В Laravel 5.4 добавлены методы orderByDesc () для построителя запросов:

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

10

Пока вам нужен результат для даты как desc

$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.