Проблемы с нумерацией страниц в Laravel 5

У меня возникают проблемы с переписанной разбивкой на страницы L5, где предыдущие методы теперь отсутствуют. В частности, lastPage() и total().

  1. Было ли это недосмотром (в этом случае я буду рад представить проблему / PR)?

  2. Смогу ли я достучаться до Коллекции и рассчитать ее самостоятельно? Я полагаю, что старый пагинатор допускал что-то подобное с __call(), однако Illuminate\Pagination\Paginator.php, похоже, даже не содержит ссылки на полную Коллекцию. Он сразу же нарезает $items, чтобы соответствовать $perPage, не оставляя мне возможности самостоятельно вычислить итог или lastPage.

  3. Должен ли я использовать LengthAwarePaginator вместо этого? И если да, то не должен ли Illuminate\Database\Eloquent\Builder::paginate() возвращать LengthAwarePaginator вместо Paginator? Я пытаюсь разбить коллекцию БД на страницы и вернуть экземпляр Paginator.

Я просто хочу убедиться, что понимаю мысль/направление разбивки на страницы в L5, прежде чем предположить, что есть ошибка, и отправить сообщение о проблеме или исправлении GH.

Обновление: теперь, когда выпущен Laravel 5, это больше не проблема. Я получаю LengthAwarePaginator, когда я paginate() в Builder.


person jszobody    schedule 23.10.2014    source источник


Ответы (2)


я столкнулся с той же проблемой. вот что я сделал, расширив класс красноречивого строителя. и поскольку у меня уже есть расширенная модель, я загрузил оттуда новый билдер.

вы можете загрузить новый билдер из расширенной модели, как это

public function newEloquentBuilder($query)
{
   return new \App\ExtendedBuilder($query);
}

ниже у меня есть расширенный строитель ..................

<?php namespace App;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Pagination\Paginator;
use Illuminate\Pagination\LengthAwarePaginator;

class ExtendedBuilder extends Builder{

public function lengthawarepaginate($perPage = null, $columns = ['*'])
{
    $page = Paginator::resolveCurrentPage();

    $perPage = $perPage ?: $this->model->getPerPage();

    $this->skip(($page - 1) * $perPage)->take($perPage);

    $queryClone = clone ($this->getQuery());

    $total = $queryClone->skip(0)->take($perPage + 1)->count($columns);


    return new LengthAwarePaginator($this->get($columns)->all(),$total, $perPage, $page, [
        'path' => Paginator::resolveCurrentPath()
    ]);
}

}

здесь я получил исходный код

не уверен, что это лучший способ сделать это, но он отлично работает.

person muhamin    schedule 28.10.2014

Что ж, теперь Laravel поддерживает общее количество страниц

Вы могли бы использовать вот так

$total = $paginatedCollection->total()

person Hrimiuc Paul    schedule 27.02.2015