Laravel 5.3 对 sortBy 集合进行分页
Posted
技术标签:
【中文标题】Laravel 5.3 对 sortBy 集合进行分页【英文标题】:Laravel 5.3 pagination on sortBy collection 【发布时间】:2017-05-03 04:33:19 【问题描述】:为什么 paginate 方法在这个例子中不起作用?
$shopIds = Follower::whereUserId($user->id)->orderBy('created_at','desc')->get()->pluck('shop_id')->toArray();
$shops = Shop::whereIn('id',$shopIds)->with('deals')->with('deals.likes')->paginate($this->perPage)->sortBy(function($likes)
return $likes->count();
);
dd($shops);
感谢您的帮助;)
【问题讨论】:
这里的错误是什么? 没有错误,但是如果我使用 paginate() 方法或 get() 方法,结果是一样的。结果没有分页,所以我不明白为什么。 【参考方案1】:paginate
工作正常,但 sortBy
方法给您带来了问题,因为当您使用 sortBy
时,它会返回一个新集合。
所以最后你的$shops
是Illuminate\Support\Collection
的一个实例而不是Illuminate\Pagination\LengthAwarePaginator
。
你可以试试:
$paginated_shops = Shop::whereIn('id',$shopIds)
->with('deals')
->with('deals.likes')
->paginate($this->perPage);
$shops = $paginated_shops->sortBy(function($likes)
return $likes->count();
);
$shops = new LengthAwarePaginator($shops, $paginated_shops->total(), $paginated_shops->perPage());
记得在类的顶部添加use
声明为:
use Illuminate\Pagination\LengthAwarePaginator;
【讨论】:
这在 2021 年帮助了我 :) 非常感谢。【参考方案2】:谢谢你们!
我就是这样解决的
$shopIds = Follower::whereUserId($user->id)->orderBy('created_at','desc')->get()->pluck('shop_id')->toArray();
$shopIds = Shop::whereIn('id',$shopIds)->with('deals')->with('deals.likes')->get()->sortBy(function($likes)
return $likes->count();
)->pluck('id')->toArray();
$orderedIds = implode(',',$shopIds);
$shops = Shop::whereIn('id', $shopIds)->whereNotIn('user_id', [$user->id])->orderByRaw(\DB::raw("FIELD(id, ".$orderedIds." )"))->paginate($this->perPage);
dd($shops);
现在我有一个 Illuminate\Pagination\LengthAwarePaginator 的实例
谢谢
【讨论】:
您不需要进行新的查询。您拥有用于分页的所有数据。这是一个多余的查询。检查我更新的答案,它可以解决您的问题而无需额外查询。【参考方案3】:就像提到的@Amit 一样,$shops 是一个集合,因此不是 LengthAwarePaginator。您将不得不自己构建分页器并对其进行切片...不要太复杂...
例如,假设您正在访问您的路线,调用您的控制器...然后将结果返回到视图...现在将使用请求中的分页信息请求该路线,您的工作是获取结果 $shops 成一个数组,将该数组分割成页面的正确结果并将其返回到您的视图中...我没有运行此代码...所以以此为例...但它看起来会有所不同喜欢:
public function yourController
// This will return a collection... we will convert it to array later
$shops = Shop::whereIn('id',$shopIds)->with('deals')->with('deals.likes')->paginate($this->perPage)->sortBy(function($likes)
return $likes->count();
);
$shopsArray = $shops->toArray();
// Here we deal with the slicing... you need to slice the page you are
// at the paging info is in the request...
// this basically gets the request's page variable... or defaults to 1
$page = Paginator::resolveCurrentPage('page') ?: 1;
// Assume 15 items per page... so start index to slice our array
$startIndex = ($page - 1) * 15;
// Length aware paginator needs a total count of items... to paginate properly
$total = count($shopsArray);
// Eliminate the non relevant items by slicing the array to page content...
$results = array_slice($shopsArray, $startIndex, 15);
$result = new LengthAwarePaginator($results, $total, 15, $page, [
'path' => Paginator::resolveCurrentPath(),
'pageName' => 'page',
]);
return view('yourView', compact('result'));
【讨论】:
以上是关于Laravel 5.3 对 sortBy 集合进行分页的主要内容,如果未能解决你的问题,请参考以下文章
Laravel - Eloquent to Json,然后对 json 对象进行 sortBy 不起作用
Laravel Eloquent 按孩子的长度排序,然后分页