Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

siusiak1000's avatar

Pagination doesn't works

I have:

$produkty_po_subkategorii = MagazineSubcategory::withCount('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate(3);
;

Pagination does not react. It still displays all products by subcategory on one page.

0 likes
43 replies
rin4ik's avatar

did you include this after foreach loop?

{{ $produkty_po_subkategorii ->links() }}
1 like
siusiak1000's avatar

Yes. Even if you do not include it

{{ $produkty_po_subkategorii ->links() }}

This pagination has to work and display three products, not all because the controller already has pagination.

siusiak1000's avatar

Update: Controller:

$search_results = MagazineSubcategory::withCount('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate($liczba_paginacji);

View:

                            @foreach($search_results as $search_result)
                                @foreach ($search_result->products as $result)
                                Extracting data...
                                @endforeach
                            @endforeach
{{ $search_results->links() }}

I think it's through the collection. I do not know how to fix it.

rin4ik's avatar

when u use count only it works right?

siusiak1000's avatar

If you mean:

$search_results = MagazineSubcategory::withCount('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate($liczba_paginacji);

        foreach ($search_results as $ilosc) {
            $s_counts = $ilosc->products_count;
        }

I receive the correct number of products in the subcategory.

rin4ik's avatar

sorry I mean with with

$search_results = MagazineSubcategory::with('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate($liczba_paginacji);
1 like
siusiak1000's avatar

with and withCount = the same result. So all products without pagination.

rin4ik's avatar
$results = MagazineSubcategory::with('products')->where('name', $subkategoria)->orderBy('id', 'desc')->firstOrFail();  
$results->products()->paginate(10);
Snapey's avatar
Snapey
Best Answer
Level 122

with

                            @foreach($search_results as $search_result)
                                @foreach ($search_result->products as $result)
                                Extracting data...
                                @endforeach
                            @endforeach
{{ $search_results->links() }}

You have only constrained the search results to the page length. The number of products listed will be however many are in each search result

You need to change the query to return products that whereHas the category you are interested in, and then paginate that

1 like
siusiak1000's avatar
        $search_results = MagazineSubcategory::whereHas('products', function ($query) {
            $query->where('name', 'wiertarki');
        })->orderBy('id', 'desc')->paginate($liczba_paginacji);

Still all products.

rin4ik's avatar

what if you do smth like this

$results = MagazineSubcategory::with('products')->where('name', $subkategoria)->orderBy('id', 'desc')->firstOrFail();  
$paginate = $results->products()->paginate(3);

pass these two variables

{{$paginate->links()}}
jlrdw's avatar

How are you calling your view? Show your entire controller code.

siusiak1000's avatar

rin4ik: Trying to get property of non-object

Controller:

    public function sklep_kat_sub($kategoria, $subkategoria)
    {
        $liczba_paginacji = 3;
        $search_results = MagazineSubcategory::withCount('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate($liczba_paginacji);

        foreach ($search_results as $ilosc) {
            $s_counts = $ilosc->products_count;
        }

        // Kategorie
        $categories = MagazineCategory::all('name', 'id');
        $subcategories = MagazineSubcategory::all('name', 'id');

        return view('strona_glowna.sklep_sub', compact('search_results', 's_counts' , 'liczba_paginacji', 'categories', 'subcategories', 'kategoria', 'subkategoria'));
    }

View:

                            @foreach($search_results as $search_result)
                                @foreach ($search_result->products as $result)
                                Extracting data...
                                @endforeach
                            @endforeach
            {{ $search_results->links() }}
Cronix's avatar
foreach ($search_results as $ilosc) {
    $s_counts = $ilosc->products_count;
}

You're not adding up the counts. $s_counts will only show the last product count.

$s_counts = 0;
foreach ($search_results as $ilosc) {
    $s_counts += $ilosc->products_count; // use += to add to the variable
}
1 like
siusiak1000's avatar

Thanks Cornix. I still have a problem with pagination :(

jlrdw's avatar

What happens if you only send this to view:

$search_results = MagazineSubcategory::withCount('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate($liczba_paginacji);

comment out your return and try with just

$search_results = MagazineSubcategory::withCount('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate(3);

return view('strona_glowna.sklep_sub', compact('search_results'));

I'd probably use normal sql for this.

siusiak1000's avatar

I have:

        $search_results = MagazineSubcategory::withCount('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate(3);

        return view('strona_glowna.sklep_sub', compact('search_results'));

View:

                            @foreach($search_results as $search_result)
                                @foreach ($search_result->products as $result)
                                {{ $result }}
                                @endforeach
                            @endforeach

Return on page:

{"id":1,"nazwa":"Wiertarka Makita","cena":32,"kopis":"<p>test<\/p>","dopis":"<p>test2<\/p>","n_img":"jsCcmDJYjpUjtQIAt7vTJg9QsBx2FCKHjFDGcpZd.png","created_at":"2018-04-10 09:05:15","updated_at":"2018-04-10 09:05:15","pivot":{"subcategory_id":1,"product_id":1}} {"id":3,"nazwa":"Wiertarka Bosh","cena":532,"kopis":"<p>test1<\/p>","dopis":"<h3>Donec sollicitudin molestie malesuada.<\/h3>\r\n<p style=\"text-align: center;\">Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Curabitur aliquet quam id dui posuere blandit. Vivamus suscipit tortor eget felis porttitor volutpat. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Curabitur non nulla sit amet nisl tempus convallis quis ac lectus.<\/p>","n_img":"AOjpGwDwfd1zspHFGYhKp1Ssb3Xo4VCng9nNVQem.png","created_at":"2018-04-10 09:07:33","updated_at":"2018-04-10 11:23:40","pivot":{"subcategory_id":1,"product_id":3}} {"id":5,"nazwa":"asdas","cena":32,"kopis":"<p>ds<\/p>","dopis":"<p>fds<\/p>","n_img":"NsIrDPtjHyOuwTkZ81geOfeuOnwxBfvEOnVrfkSk.png","created_at":"2018-04-10 18:42:41","updated_at":"2018-04-10 18:42:41","pivot":{"subcategory_id":1,"product_id":5}} {"id":6,"nazwa":"dfg","cena":32,"kopis":"<p>22<\/p>","dopis":"<p>ds<\/p>","n_img":"0xRkSmG56916zQViUsca2MvnYmPbLrTqqGMoeI2M.png","created_at":"2018-04-10 18:42:48","updated_at":"2018-04-10 18:42:48","pivot":{"subcategory_id":1,"product_id":6}} {"id":7,"nazwa":"43dsdsd","cena":32,"kopis":"<p>sasdsad<\/p>","dopis":"<p>sadsad<\/p>","n_img":"EeiAsF6MoZdAjzt378cawFlwffKknIE9u1baRSR4.png","created_at":"2018-04-10 18:43:09","updated_at":"2018-04-10 18:43:09","pivot":{"subcategory_id":1,"product_id":7}}

There is no pagination here.

When I add in controller:

return $search_results = MagazineSubcategory::withCount('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate(3);

Return:

{"current_page":1,"data":[{"id":1,"name":"Wiertarki","created_at":"2018-04-10 09:04:28","updated_at":"2018-04-10 09:04:28","products_count":5}],"first_page_url":"http:\/\/mesiek.pl\/magazyn\/kategoria1\/wiertarki?page=1","from":1,"last_page":1,"last_page_url":"http:\/\/mesiek.pl\/magazyn\/kategoria1\/wiertarki?page=1","next_page_url":null,"path":"http:\/\/mesiek.pl\/magazyn\/kategoria1\/wiertarki","per_page":3,"prev_page_url":null,"to":1,"total":1}

Here, pagination exists.

jlrdw's avatar
{"current_page":1,"data":[{"id":1,"name":"Wiertarki","created_at":"2018-04-10 09:04:28","updated_at":"2018-04-10 09:04:28","products_count":5}],"first_page_url":"http:\/\/mesiek.pl\/magazyn\/kategoria1\/wiertarki?page=1","from":1,"last_page":1,"last_page_url":"http:\/\/mesiek.pl\/magazyn\/kategoria1\/wiertarki?page=1","next_page_url":null,"path":"http:\/\/mesiek.pl\/magazyn\/kategoria1\/wiertarki","per_page":3,"prev_page_url":null,"to":1,"total":1}

This shows in view?

jlrdw's avatar

Try passing this stuff

return view('strona_glowna.sklep_sub', compact('search_results', 's_counts' , 'liczba_paginacji', 'categories', 'subcategories', 'kategoria', 'subkategoria'));

using ->with like

return view($layout)->with('content', $content)->with('title', $title);
// just example
siusiak1000's avatar

When I add "return" in the controller before $search_result.

siusiak1000's avatar
    public function sklep_kat_sub($kategoria, $subkategoria)
    {

        $liczba_paginacji = 3;
        $search_results = MagazineSubcategory::with('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate($liczba_paginacji);

        $s_counts = 0;
        foreach ($search_results as $ilosc) {
            $s_counts += $ilosc->products_count;
        }


        // Kategorie
        $categories = MagazineCategory::all('name', 'id');
        $subcategories = MagazineSubcategory::all('name', 'id');

        return view('strona_glowna.sklep_sub', compact('search_results', 's_counts' , 'liczba_paginacji', 'categories', 'subcategories', 'kategoria', 'subkategoria'));

    }

Still all products ...

Interesting fact: When I type in the link domain.com?page=2, the page does not return an error and does not print an error. Il not receive products but it shows me the pagination.

jlrdw's avatar

Whole controller

    public function sklep_kat_sub($kategoria, $subkategoria)
    {
        $liczba_paginacji = 3;
        $search_results = MagazineSubcategory::withCount('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate($liczba_paginacji);

        foreach ($search_results as $ilosc) {
            $s_counts = $ilosc->products_count;
        }

        // Kategorie
        $categories = MagazineCategory::all('name', 'id');
        $subcategories = MagazineSubcategory::all('name', 'id');

        return view('strona_glowna.sklep_sub', compact('search_results', 's_counts' , 'liczba_paginacji', 'categories', 'subcategories', 'kategoria', 'subkategoria'));
    }

Replace this

return view('strona_glowna.sklep_sub', compact('search_results', 's_counts' , 'liczba_paginacji', 'categories', 'subcategories', 'kategoria', 'subkategoria'));

with

return view('strona_glowna.sklep_sub')->with('search_results, $search_results )->with( //replace all that way);  // chain the ->with statements
siusiak1000's avatar
    public function sklep_kat_sub($kategoria, $subkategoria)
    {
        $liczba_paginacji = 3;
        $search_results = MagazineSubcategory::withCount('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate($liczba_paginacji);

        foreach ($search_results as $ilosc) {
            $s_counts = $ilosc->products_count;
        }

        // Kategorie
        $categories = MagazineCategory::all('name', 'id');
        $subcategories = MagazineSubcategory::all('name', 'id');

        return view('strona_glowna.sklep_sub')->with('search_results', $search_results)->with('s_counts', $s_counts)->with('categories', $categories)->with('subcategories', $subcategories)->with('kategoria', $kategoria)->with('subkategoria', $subkategoria);
    }

Again displays all products assigned to the subcategory. No pagination.

jlrdw's avatar

What happens here


 public function sklep_kat_sub($kategoria, $subkategoria)
    {
        $liczba_paginacji = 3;
        $search_results = MagazineSubcategory::withCount('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate($liczba_paginacji);

        foreach ($search_results as $ilosc) {
            $s_counts = $ilosc->products_count;
        }

        // Kategorie
        $categories = MagazineCategory::all('name', 'id');
        $subcategories = MagazineSubcategory::all('name', 'id');

        return view('strona_glowna.sklep_sub')->with('search_results', $search_results);
    }

Something strange here

Also try without the withCount.

siusiak1000's avatar

The same all the time...

When I use the same but without a relationship. I have get only products without relation - pagination works.

rin4ik's avatar

try this as well

$results = MagazineSubcategory::where('name', $subkategoria)->orderBy('id', 'desc')->firstOrFail();  
$paginator = $results->products->paginate(3);
$results->load('products');
return view('strona_glowna.sklep_sub', compact('results', 'paginator','s_counts' , 'liczba_paginacji', 'categories', 'subcategories', 'kategoria', 'subkategoria'));
 @foreach($results as $search_result)
                                @foreach ($search_result->products as $result)
                                {{ $result }}
                                @endforeach
                            @endforeach

{{$paginator->links()}}
siusiak1000's avatar
    public function sklep_kat_sub($kategoria, $subkategoria)
    {
        $search_results = MagazineSubcategory::where('name', $subkategoria)->orderBy('id', 'desc')->firstOrFail();  
        $paginator = $search_results->products->paginate(3);
        $search_results->load('products');
        return view('strona_glowna.sklep_sub', compact('search_results', 'paginator','s_counts' , 'liczba_paginacji', 'categories', 'subcategories', 'kategoria', 'subkategoria'));
    }
                            @foreach($search_results as $search_result)
                                @foreach ($search_result->products as $result)
                                {{ $result }}
                                @endforeach
                            @endforeach

{{$paginator->links()}}

Result: BadMethodCallException. Method paginate does not exist.

jlrdw's avatar
return $results = MagazineSubcategory::withCount('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate(3);   

Worked, did you just DD it to get it working in that way. Irregardless it should also work in view have you considered trying a Lengthaware paginator.

You need to break your code down piece-by-piece something is not right. If $results worked, then the last attempt should have worked.

jlrdw's avatar

This is one of the main reasons I like writing a more complex query using getPdo () less headaches.

Next

Please or to participate in this conversation.