did you include this after foreach loop?
{{ $produkty_po_subkategorii ->links() }}
Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.
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.
did you include this after foreach loop?
{{ $produkty_po_subkategorii ->links() }}
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.
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.
when u use count only it works right?
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.
sorry I mean with with
$search_results = MagazineSubcategory::with('products')->where('name', $subkategoria)->orderBy('id', 'desc')->paginate($liczba_paginacji);
with and withCount = the same result. So all products without pagination.
$results = MagazineSubcategory::with('products')->where('name', $subkategoria)->orderBy('id', 'desc')->firstOrFail();
$results->products()->paginate(10);
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
$search_results = MagazineSubcategory::whereHas('products', function ($query) {
$query->where('name', 'wiertarki');
})->orderBy('id', 'desc')->paginate($liczba_paginacji);
Still all products.
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()}}
How are you calling your view? Show your entire controller code.
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() }}
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
}
Thanks Cornix. I still have a problem with pagination :(
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.
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.
{"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?
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
When I add "return" in the controller before $search_result.
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.
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
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.
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.
The same all the time...
When I use the same but without a relationship. I have get only products without relation - pagination works.
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()}}
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.
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 My turn for the popcorn lol
This is one of the main reasons I like writing a more complex query using getPdo () less headaches.
Please or to participate in this conversation.