fazlulkabir's avatar

trouble with pagination with collection

this is my route:

Route::get('/home', 'ForumsController@index')->name('home');

this is my index function:

    public function index()
    {
        switch (request('filter')) {
            case 'me':
                $user=Auth::user();
                $discussions=$user->discussions('created_at','desc')->paginate(3);
                    break;

            case 'unsolved':
                $result=array();

                foreach (Discussion::all() as $discussion) 
                {
                    if(!$discussion->hasBestAns())
                        array_push($result, $discussion);
                }
                    $discussions=collect($result);

                    $currentPage = LengthAwarePaginator::resolveCurrentPage();


                    $discussions=new LengthAwarePaginator($discussions,count($discussions),3,['path' => request()->url()]);

                    break;

            case 'solved':
                $result=array();

                foreach (Discussion::all() as $discussion) {
                    if($discussion->hasBestAns())
                        array_push($result, $discussion);

                }
                    $discussions=collect($result);

                    $discussions=new Paginator($discussions,3);

                    break;
            
            default:
                $discussions=Discussion::orderBy('created_at','desc')->paginate(3);
                    break;


        }

        return view('index')
        ->with('discussions',$discussions);
    }

these are my links:

        <li class="list-group-item">
        <a href="/home">Home</a></li>

        <li class="list-group-item">
        <a href="{{ route('home',['filter'=>'me']) }}">My Discussions</a></li>

        <li class="list-group-item">
        <a href="{{ route('home',['filter'=>'unsolved']) }}">Opened Discussions</a></li> 

        <li class="list-group-item">
        <a href="/home?filter=solved">Closed Discussions</a></li>

when there are no filters everything works fine. When if use filter first page works fine but when I click second or another page it produces

"http://forum.local/?page=2"

but I need

"http://forum.local/home?filter=unsolved&page=2"

how can I do that?

0 likes
5 replies
Vaggelis2018's avatar

You need to append in pagination your filters with something like this: $discussions=$user->discussions('created_at','desc')->paginate(3)->appends($filters); I hope it helps

fazlulkabir's avatar

@JLRDW - thanks a lot. I resolved it with a function

    public function paginate($items,$baseUrl = null, $perPage = 5, $page = null,$options = [])
    {
        $page = $page ?: (Paginator::resolveCurrentPage() ?: 1);

        $items = $items instanceof Collection ? 
                       $items : Collection::make($items);

        $lap = new LengthAwarePaginator($items->forPage($page, $perPage), 
                           $items->count(),
                           $perPage, $page, $options);

        if ($baseUrl) {
            $lap->setPath($baseUrl);
        }
    return $lap;
    }

here the main problem was solved by $baseUrl variable and $baseUrl function parameter. but you to said paginate the query how can I do so when I'm working with relationships? should I alter the table and add another column? what do you suggest?

jlrdw's avatar

Same way you do in a collection except you just get so many results at a time.

Many of these things take some trial-and-error to get exactly right there's no one shot quick answer.

But eloquent relations can be paginated, many people do it all the time.

You may need to do a search on paginating eloquent relationships.

Please or to participate in this conversation.