由于sortBy的Laravel分页错误

时间:2019-06-03 14:23:14

标签: php laravel paginate

我正在尝试对一个雄辩的对象进行分页,但是我无法使其正常工作。由于$ 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()函数替换为分页函数,但是我的自定义订单将仅应用于分页中的5个项目。

我宁愿不使用任何原始sql

2 个答案:

答案 0 :(得分:3)

paginate是一种雄辩的方法,因此不适用于您的收藏集。但是,集合具有forPage方法,您可以使用该方法:

  

forPage方法返回一个新集合,该集合包含将在给定页码上显示的项目。该方法接受页码作为它的第一个参数,接受每页显示的项目数作为它的第二个参数

所以您需要的是

$products->forPage(1, 5);

答案 1 :(得分:1)

您确实必须将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