我正在尝试对一个雄辩的对象进行分页,但是我无法使其正常工作。由于$ 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
答案 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