"Method links does not exist" with Laravel pagination
Stefan Bogdanescu
Founder & Senior Architect · 2026-06-29
Fixing the "Method links does not exist" Error with Laravel Pagination
As a senior developer working with the Laravel ecosystem, you’ve likely encountered this frustrating error when trying to implement pagination: Method Illuminate\Database\Eloquent\Collection::links does not exist. This issue stems from a fundamental misunderstanding of what Laravel expects when handling database results versus paginated results.
This post will diagnose exactly why this error occurs and provide the correct, idiomatic Laravel solution using Eloquent and its built-in pagination features.
The Root Cause: Collection vs. Paginator
The error message is not an error in your view syntax; it’s a signal from PHP/Laravel telling you that the object you are calling $posts->links() on does not possess that method.
When you execute a standard query using methods like Post::where(...)->get(), Eloquent returns an Illuminate\Database\Eloquent\Collection. A Collection is simply a wrapper around a flat array of models; it holds the data but has no built-in awareness of pagination metadata (like total pages, current page, next/previous links).
The .links() method, which generates the necessary HTML for pagination navigation, is not a method on the base Collection class. It only exists on objects that implement the Paginator interface, such as the result of using the paginate() methods provided by Eloquent.
In short: You cannot paginate an unsorted, unfiltered collection; you must use the built-in pagination features.
The Correct Solution: Using Eloquent Pagination
To correctly handle pagination in Laravel, you should delegate the responsibility of fetching and structuring the results directly to the Eloquent query builder using methods like paginate(). This method executes the necessary SQL LIMIT and OFFSET clauses behind the scenes and returns a fully functional Paginator object.
Incorrect Approach (The Error Source)
Your original code was:
// Controller
$posts = Post::where('visible', 1)
->where('expire_date', '>', $current)
->where('delete', 0)
->get(); // Returns an Eloquent Collection
return view('search', compact('posts'));When you try to call $posts->links() in the view, you hit the error because $posts is just a collection.
The Correct Approach (The Laravel Way)
Instead of using get(), use paginate() on your query. This returns an instance of LengthAwarePaginator, which does implement the necessary methods, including links().
// Controller
use App\Models\Post;
public function index(Request $request)
{
$posts = Post::where('visible', 1)
->where('expire_date', '>', $current)
->where('delete', 0)
->paginate(15); // Specify how many items per page
return view('search', compact('posts'));
}Updating the View
With the correct Paginator object returned, your view code will now work perfectly:
<!-- View -->
<div class="pagination-bar text-center">
{{ $posts->links() }}
</div>This simple change resolves the error because $posts is now a Paginator object capable of generating the required pagination links. This adherence to Laravel's intended structure makes your code cleaner, more robust, and easier to maintain—a core principle behind effective framework design, as you see with the powerful tools available on platforms like Laravel Company.
Advanced Pagination Options
While paginate() is the most common method, Laravel offers other convenient ways to handle result sets depending on your needs:
paginate(int $perPage): The standard approach. It returns aLengthAwarePaginator.simplePaginate(int $perPage): If you only need basic links (previous/next) and the total count, but don't need to display the full page numbers in the navigation bar, use this method. It is more memory efficient for very large datasets.
Example Using simplePaginate
If your goal is just simple navigation:
// Controller
$posts = Post::where('visible', 1)
->where('expire_date', '>', $current)
->where('delete', 0)
->simplePaginate(20); // Returns a SimplePaginator
return view('search', compact('posts'));The resulting $posts object will still have the links() method, but it will only contain the essential links, making your pagination bar cleaner for simpler requirements.
Conclusion
The error "Method ... does not exist" in a Laravel context almost always indicates that you are trying to call a method on the wrong type of object. By understanding the difference between an Eloquent Collection (flat data) and an Eloquent Paginator (data with navigation metadata), you can write code that is both functional and idiomatic. Always remember to use the built-in methods like paginate() when dealing with database results in Laravel; it saves time, reduces bugs, and leverages the power of the framework effectively.