Laravel 12 E-Commerce Project

Laravel 12 E-Commerce Project - Products Filter By Brand


Laravel 12 E-Commerce: Implementing Products Filter By Brand

This tutorial covers the steps for implementing product filtering by brand on the shop page by updating the `ShopController` and `shop.blade.php` view.


1. Update ShopController to Handle Brand Filter

The `index` function in `ShopController.php` is modified to fetch all brands and apply a `WHERE IN` condition to the product query based on the comma-separated `brands` value from the query string.

Fetch Brands and Get Filter Parameter

public function index(Request $request)
{        
    // Existing sorting and size logic...
    $size = $request->query("size") ? $request->query("size") : 12; 
    $order = $request->query("orderby") ? $request->query("orderby") : 1; 
    // ... switch case logic for $o_column and $o_order ...
    
    // Fetch all brands to display on the sidebar
    $brands = Brand::orderBy("name","ASC")->get();
    
    // Get the brand filter parameter from the query string
    $f_brands = $request->query("brands"); // e.g., "1,5,10"
    // 1. Apply Brand Filter Condition
    $products = Product::where(function($query) use($f_brands) {
        // If brands are selected ($f_brands is not empty), filter by brand_id
        // Otherwise (orWhereRaw), if $f_brands is empty, the filter is effectively skipped,
        // allowing all products to be returned.
        $query->whereIn("brand_id", explode(",", $f_brands))
              ->orWhereRaw(""" . $f_brands . ""=""");
    })
    ->orderBy($o_column, $o_order)
    ->paginate($size);    
    
    // Return the brands and the active filter value to the view
    return view("shop", compact("products", "size", "order", "brands", "f_brands"));
} 

2. Update `shop.blade.php` for Brand Checkboxes

In `shop.blade.php`, the Brands section is updated to display a list of all brands retrieved from the controller. Checkboxes are added, and JavaScript is included to handle the selection and form submission.

Brand Filter HTML (Sidebar)

<div class="sidebar-widget">
    <h4 class="widget-title">Filter By Brands</h4>
    <div class="widget-checkbox widget-categories">
        <ul class="checkbox-items">
            @foreach ($brands as $brand)
                <li>
                    <input type="checkbox"
                        id="brand{{ $brand->id }}"
                        name="brands"
                        value="{{ $brand->id }}"
                        class="chk-brand"
                        {{-- Check if this brand'sID is in the comma-separated $f_brands string --}}
                        @if($f_brands && in_array($brand->id, explode(",", $f_brands))) checked="checked" @endif
                    >
                    <label for="brand{{ $brand->id }}">
                        <span></span>{{ $brand->name }}
                    </label>
                </li>
            @endforeach
        </ul>
    </div>
</div>

Hidden Input in Filter Form

A hidden input field is added to the main filtering form (`#frmfilter`) to store the comma-separated list of selected Brand IDs before submission.

<!-- Inside the main filtering form with id="frmfilter" -->
<input type="hidden" name="brands" id="hdnBrands" value="{{$f_brands}}">

JavaScript for Checkbox Logic

JavaScript is added to listen for changes on the brand checkboxes, compile the selected brand IDs into a comma-separated string, update the hidden field, and submit the form.

@push("scripts")
<script>
    // Event listener for Brand checkboxes
    $(".chk-brand").on("change", function() {
        var brands = "";
        
        // Loop through all checkboxes with class "chk-brand"
        $(".chk-brand").each(function() {
            if ($(this).is(":checked")) {
                // Compile selected brand IDs into a comma-separated string
                if (brands === "") {
                    brands += $(this).val();
                } else {
                    brands += "," + $(this).val();
                }
            }
        });
        // Set the value of the hidden input field
        $("#hdnBrands").val(brands);
        // Submit the form to apply the filter
        $("#frmfilter").submit();
    });
</script>
@endpush

This implementation allows users to select one or more brands to filter the products displayed on the shop page.

Written by Surfside Media

Senior Full Stack Developer specializing in Web Technologies.