Eloquent ORM получает запрос о последних товарах - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь получить все последние элементы и отсортировать по убыванию идентификатора (т.е. получить все элементы, которые были только что добавлены с ограничением и смещением).

Итак, я сделал это:

$products = Product::all()
                ->slice($request->get('offset'))
                ->take($request->get('limit'))
                ->sortByDesc('id')
                ->toBase();

Однако если у меня больше этого предела, то у меня нет правильного порядка. Это заставляет меня сказать 10 продуктов, но не отсортировано исправлено. Любая идея, как это сделать с Eloquent ORM?

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Вы, вероятно, намереваетесь заставить базу данных обрабатывать смещение, пропускать и упорядочивать вместо того, чтобы извлекать все возможные записи, затем брать только то, что вы хотите, а затем сортировать их ... если вы собираетесь делать это так, как вам нужносортировать, прежде чем пропустить и принять, кстати.

Использование базы данных для фильтрации и упорядочения:

$products = Product::skip($request->input('offset'))
    ->take($request->input('limit'))
    ->orderBy('id', 'desc')
    ->get();
1 голос
/ 25 октября 2019

Я думаю, проблема в том, что вы сначала используете ::all(), который возвращает все Product экземпляра в Collection, а затем методы сбора. Поскольку эти методы действуют в порядке использования, перед сортировкой вы разбиваете на части и смещаете, поэтому каждый раз вы получаете одни и те же продукты. Используйте правильный синтаксис Builder для правильной и эффективной обработки:

$products = Product::offset($request->input("offset"))
->limit($request->input("limit"))
->orderBy("id", "DESC")
->get();

Поскольку это экземпляр Builder, запрос будет скомпилирован и выполнен в соответствии с логикой грамматики вашей Базы данных и в одномзапрос. Нет ничего плохого в использовании логики Collection, вам просто нужно использовать правильный порядок методов (сначала sortByDesc(), затем slice(), затем take()), но это невероятно неэффективно, так как вы должны обрабатывать всеProduct в вашей базе данных.

...