Laravel Eloquent how to get all products according to category id

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Laravel Eloquent: How to Get All Products According to Category ID

Welcome to the world of database relationships! It is extremely common, especially when starting out with Laravel and Eloquent, to grapple with how to seamlessly connect related data. The problem you are facing—retrieving all products belonging to a specific category—is one of the most fundamental operations in any application. Don't worry; this is a classic scenario, and once you understand the power of Eloquent relationships, it becomes trivial.

As senior developers, we rely on Eloquent to abstract away complex SQL queries into elegant PHP methods. Let's break down exactly how you can achieve this efficiently using your existing model structure.

Understanding Your Setup

Before diving into the solution, let’s quickly review the foundation you have established:

  1. products Table: Contains cat_id, which is a foreign key linking to the categories table.
  2. categories Table: Stores category details (id, cat_name, etc.).
  3. Eloquent Relationships: You have correctly defined the relationship:
    • In the Product model: public function category() { return $this->belongsTo('App\Category','category_id'); }
    • In the Category model: public function products() { return $this->hasMany('App\Product'); }

These relationships are the key to unlocking relational data querying.

Method 1: Querying Directly via Foreign Key (The Straightforward Approach)

If you only need a simple list of products based on a known ID, you can use the standard Eloquent where() clause directly on the Product model. This method is highly efficient when dealing with direct foreign key lookups.

Suppose you know the ID of the category you are interested in (let's say category_id = 5).

php
use App\Models\Product;

class UserProductsController extends Controller
{
    public function getProductsByCategory(int $categoryId)
    {
        // Find all products where the category_id matches the provided ID
        $products = Product::where('cat_id', $categoryId)->get();

        if ($products->isEmpty()) {
            return response()->json(['message' => 'No products found for this category.'], 404);
        }

        return response()->json($products);
    }
}

This approach is fast and perfectly valid. It directly translates to an SQL query like SELECT * FROM products WHERE cat_id = 5;. This is great when you are querying based on a known primary key relationship.

Method 2: Leveraging Eloquent Relationships (The Relational Approach)

While Method 1 works, the true power of Eloquent lies in using the defined relationships to fetch data in a more object-oriented and flexible manner. If you start from a Category model, you can easily pull all its related products through the defined hasMany relationship.

To achieve this, you would first find the category, and then access its related products:

php
use App\Models\Category;

class UserProductsController extends Controller
{
    public function getProductsByCategoryId(int $categoryId)
    {
        // 1. Find the specific category
        $category = Category::findOrFail($categoryId);

        // 2. Use the 'products' relationship to fetch all related products
        $products = $category->products;

        return response()->json($products);
    }
}

This second method is often preferred because it keeps your query logic tightly coupled with your data structure. It makes your code more readable and maintainable, which is a core principle in building robust applications on Laravel. For more advanced relationship management and database interactions, exploring the comprehensive documentation available at laravelcompany.com will provide you with extensive knowledge.

Conclusion: Choosing the Right Tool

Both methods successfully solve your problem, but they serve slightly different contexts. Use Method 1 when you are querying directly via a foreign key in a high-performance scenario or when you need to query across multiple tables without loading the parent object first. Use Method 2 when you are already operating within the context of an Eloquent model and want to leverage the defined relationships for cleaner, more object-oriented data retrieval.

For your initial project, understanding the concept of belongsTo and hasMany is crucial. Master these relationships, and you will find that building complex features in Laravel becomes remarkably intuitive. Keep up the great work!