2014-10-23 3 views
1

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

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

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

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

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

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

ответ

3

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

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

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() 
    ]); 
} 

}

this is where i got the original code from

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

0

Ну, теперь Laravel поддержка пагинация общая

Вы можете использовать как этого

$ всего = $ paginatedCollection-> общий()

Смежные вопросы