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 时,它会返回一个新集合。

所以最后你的$shopsIlluminate\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

我需要在 laravel 中使用 sortBy 进行分页

Laravel Eloquent 按孩子的长度排序,然后分页

scala中 sorted,sortBy,sortWith语法使用

scala中 sorted,sortBy,sortWith语法使用