Ошибка разбиения на страницы Laravel из-за sortBy - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь разбить красноречивый объект на страницы, но не могу заставить его работать.Страничка выдает ошибку, потому что $ products - это не объект построителя запросов, а коллекция.

// i get this value from a $POST variable
$customOrderIds = [3,2,1,4,6,5,9,8,10,7,11,12,13,14,15,16,17,20,18,19,21,22]; // I want the products ordered in this sequence
$products = Product::get()->sortBy(function($product) use($customOrderIds) 
{
    return array_search($product->id, $customOrderIds);
});

$products->paginate(5); // Error is thrown here

Я хочу сохранить порядок продуктов, определенный в $ customOrderIds

В других вопросах они предлагают заменить функцию get () на функцию paginate, но затем мой заказбудет применяться только к 5 пунктам в нумерации страниц.

Я бы не стал использовать что-либо с raw sql

Ответы [ 2 ]

3 голосов
/ 03 июня 2019

paginate - это метод Eloquent, поэтому он не будет работать с вашей коллекцией. Однако коллекции имеют метод forPage, который можно использовать:

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

Так что вам нужно будет

$products->forPage(1, 5);
1 голос
/ 03 июня 2019

Вы действительно должны заменить get на paginate, но вам придется выполнить сортировку перед вами paginate. Вы можете попробовать что-то вроде:

Product::orderByRaw(
    'FIELD(id,3,2,1,4,6,5,9,8,10,7,11,12,13,14,15,16,17,20,18,19,21,22)'
)->paginate(5);

Источники:

https://laravel.com/docs/5.8/queries#raw-expressions https://laracasts.com/discuss/channels/eloquent/custom-orderby-in-laravel-query-builder

...