Как сделать пагинацию - PullRequest
       9

Как сделать пагинацию

0 голосов
/ 19 сентября 2018

Привет, у меня возникли некоторые проблемы с нумерацией страниц, поэтому я использую пагинацию с помощью этого простого кода

$posts = Auth::user()->posts()->latest()->paginate(5);

, и он автоматически разбивается на страницы

, но когда я использую такой код

$count = $this->getCountPost()->paginate(5);

получит ошибку

Метод Illuminate \ Database \ Eloquent \ Collection :: paginate не существует.

это моя функция getcountpost

private function getCountPost(){
    $user = Auth::user();
    $posts = $user->posts;
    foreach ($posts as $key => $value) {
        $posts[$key]->comment_to_post = Post::where('id_post', $value->id)->count();
    }
    return $posts;

надеюсь, вы поможете мне, ребята

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Вы можете добавить вспомогательную функцию для вашей модели Post, чтобы подсчитывать, что вы хотите рассчитывать для каждого сообщения.

public function getCommentsToPostCount($id)
{
    return Post::where('id_post', $id)->count();
} // this is an alternative for your `for` loop.

А затем давайте обновим ваш getCountPost

private function getCountPost(){
    return Auth::user()->posts();
}

Теперь, когда вы используете, вы можете:

$pages = $this->getCountPost()->paginate(5);
0 голосов
/ 19 сентября 2018

переменная $ post содержит общее количество страниц, и вы можете использовать это как $post->total

0 голосов
/ 19 сентября 2018

Для этого доступно несколько подходов.

Метод 1:

Для разбиения на страницы в коллекции Laravel предоставляет метод, называемый forPage

https://laravel.com/api/master/Illuminate/Support/Collection.html#method_forPage

Попробуйте следующий метод, и, возможно, это то, что вы ищете.

return $this->getCountPost()->forPage(1, 10);

Для этого сценария вам придется придумать свою собственную логику, чтобы добавить ссылки на страницы.

однако, следующий подход облегчит жизнь.

Метод 2:

Использование Laravel's LengthAwarePaginator

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;

use App\Http\Requests;

class ItemsController extends Controller
{
     public function items(Request $request)
    {
        $items = [
            'item1',
            'item2',
            'item3',
            'item4',
            'item5',
            'item6',
            'item7',
            'item8',
            'item9',
            'item10'
            ];

        // Get current page form url e.x. &page=1
        $currentPage = LengthAwarePaginator::resolveCurrentPage();

        // Create a new Laravel collection from the array data
        $itemCollection = collect($items);

        // Define how many items we want to be visible in each page
        $perPage = 1;

        // Slice the collection to get the items to display in current page
        $currentPageItems = $itemCollection->slice(($currentPage * $perPage) - $perPage, $perPage)->all();

        // Create our paginator and pass it to the view
        $paginatedItems= new LengthAwarePaginator($currentPageItems , count($itemCollection), $perPage);

        // set url path for generted links
        $paginatedItems->setPath($request->url());

        return view('items_view', ['items' => $paginatedItems]);
    }

И на блейд-файле

 <h1>Items List</h1>

<ul>
@foreach ($items as $item) 
   <li> {{ $item }} </li>
@endforeach
</ul>

<div>
{{ $items->links() }}
</div>

Ссылка: https://arjunphp.com/laravel-5-pagination-array/

...