Laravel 5.3 разбиение цепочки на страницы после фильтра

#php #laravel

#php #laravel

Вопрос:

 $posts = Post::all()->filter(function($item) use (amp;$pYear){
    return Persian::jDate(...) == $pYear;
})->sortByDesc('id')->paginate(5);
  

Когда я разбиваю цепочку на страницы (5), я получаю эту ошибку «Метод разбивки на страницы не существует». Как я могу разбить свой результат на страницы, пожалуйста, помогите, спасибо.

Комментарии:

1. вы интегрировали разбиение на страницы в своем представлении?

2. @DiegoCespedes, {!! $posts->links() !!} ?

Ответ №1:

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

 use IlluminatePaginationLengthAwarePaginator;

protected $perPage = 5;

$posts = Post::get()->filter(function($item) use (amp;$pYear){
    return Persian::jDate(...) == $pYear;
})->sortByDesc('id');

//this code simulates: ->paginate(5)
$posts = new LengthAwarePaginator(
         $posts->slice((LengthAwarePaginator::resolveCurrentPage() *
         $this->perPage)-$this->perPage,
         $this->perPage)->all(), count($posts),
         $this->perPage, null, ['path' => '']);
 
  

Ответ №2:

Попробуйте удалить all()

 $posts = Post::filter(function($item) use (amp;$pYear){
    return Persian::jDate('Y', strtotime($item->created_at),'','Asia/Tehran','en') == $pYear;
})->sortByDesc('id')->paginate(5);
  

Комментарии:

1. Вызов неопределенного метода IlluminateDatabaseQueryBuilder::filter()

2. Возможно, вам лучше заставить его работать с ->where закрытием, а не filter

3. Мне нужен код, похожий на этот, но это не работает! $posts = Post::where(Persian::jDate('Y', strtotime('created_at'),'','Asia/Tehran','en'), $pYear);