Filter products or data using ajax in laravel 11

 <?php


namespace App\Http\Controllers;

use App\Models\Category;
use App\Models\ProductsTwo;
use Illuminate\Http\Request;

class ProductController extends Controller
{
    public function filterProduct(Request $request)
    {
        $query = ProductsTwo::query();
        $categories = Category::all();

        if ($request->ajax()) {
            if (empty($request->category)) {
                $products = $query->get();
            } else {
                $products = $query->where(["category_id" => $request->category])->get();
            }
            return response()->json(["products" => $products]);
        }
        $products = $query->get();
        return view("product", compact("products", "categories"));
    }
}
Above File is app\Http\Controllers\ProductController.php File





Below File is app\Models\Category.php File
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    public $timestamps = true;
    protected $table = "categories";
    protected $fillable = ["name"];
}





Below File is app\Models\ProductsTwo.php File
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class ProductsTwo extends Model
{
    public $timestamps = true;
    protected $table = "productstwo";
    protected $fillable = ["name", "price", "description", "category_id"];
}





Below File is database\json\categories.php File
[
    {
        "name": "Shoes"
    },
    {
        "name": "Clothes"
    },
    {
        "name": "Sports"
    }
]






Below File is database\json\productstwo.json File
[
    {
        "name": "Athletic shoes",
        "price": 2500,
        "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit",
        "category_id": 1
    },
    {
        "name": "Ballet flats",
        "price": 3000,
        "description": "sed do eiusmod tempor incididunt ut labore et",
        "category_id": 1
    },
    {
        "name": "Business attire",
        "price": 1500,
        "description": "dolore magna aliqua. Ut enim ad minim veniam",
        "category_id": 2
    },
    {
        "name": "Casual wear",
        "price": 2500,
        "description": "quis nostrud exercitation ullamco laboris nisi ut",
        "category_id": 2
    },
    {
        "name": "Lingerie",
        "price": 3500,
        "description": "aliquip ex ea commodo consequat",
        "category_id": 2
    },
    {
        "name": "Womenswear",
        "price": 2400,
        "description": "Duis aute irure dolor in reprehenderit in voluptate velit",
        "category_id": 2
    },
    {
        "name": "Brogue shoes",
        "price": 5000,
        "description": "esse cillum dolore eu fugiat nulla pariatur",
        "category_id": 1
    },
    {
        "name": "Basketball",
        "price": 6000,
        "description": "Excepteur sint occaecat cupidatat non",
        "category_id": 3
    },
    {
        "name": "Badminton",
        "price": 3000,
        "description": "proident, sunt in culpa qui officia",
        "category_id": 3
    },
    {
        "name": "Bodybuilding",
        "price": 10000,
        "description": "deserunt mollit anim id est laborum.",
        "category_id": 3
    },
    {
        "name": "Bat & Ball",
        "price": 2300,
        "description": "Sed ut perspiciatis unde omnis iste natus error sit",
        "category_id": 3
    }
]






Below File is database\migrations\2025_01_03_092442_create_categories_table File
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->string("name");
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('categories');
    }
};






Below File is database\migrations\2025_01_03_092730_create_productstwo_table File
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('productstwo', function (Blueprint $table) {
            $table->id();
            $table->string("name");
            $table->integer("price");
            $table->longText("description");
            $table->unsignedBigInteger("category_id");
            $table->foreign("category_id")->references("id")->on("productstwo")->onUpdate("cascade")->onDelete("cascade");
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('productstwo');
    }
};






Below File is database\seeders\CategorySeeder.php File
<?php

namespace Database\Seeders;

use App\Models\Category;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\File;

class CategorySeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $json = File::get(path: "database\json\categories.json");
        $categories = collect(json_decode($json));

        $categories->each(function ($categories) {
            Category::create([
                "name" => $categories->name
            ]);
        });
    }
}






Below File is database\seeders\DatabaseSeeder.php File
<?php

namespace Database\Seeders;

use App\Models\User;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        // User::factory(10)->create();

        // User::factory()->create([
        //     'name' => 'Test User',
        //     'email' => 'test@example.com',
        // ]);

        $this->call([
            ProductsTwoSeeder::class,
            CategorySeeder::class
        ]);
    }
}






Below File is database\seeders\ProductsTwoSeeder.php File
<?php

namespace Database\Seeders;

use App\Models\ProductsTwo;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\File;

class ProductsTwoSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $json = File::get(path: "database/json/productstwo.json");
        $productstwo = collect(json_decode($json));

        $productstwo->each(function ($productstwo) {
            ProductsTwo::create([
                "name" => $productstwo->name,
                "price" => $productstwo->price,
                "description" => $productstwo->description,
                "category_id" => $productstwo->category_id
            ]);
        });
    }
}





Below File is resources\views\product.blade.php File
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Product</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
</head>
<body>
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-10">
                <div class="card">
                    <div class="card-header">
                        <h4>Categories</h4>
                    </div>
                    <div class="card-body">
                        <select name="category" id="category">
                            <option value="">Select Category</option>
                            @if(count($categories) > 0)
                                @foreach($categories as $category)
                                    <option value="{{ $category['id'] }}">{{ $category->name }}</option>
                                @endforeach
                            @endif
                        </select><br><br>

                        <table class="table table-bordered table-striped table-hovered">
                            <thead>
                                <th>ID</th>
                                <th>Name</th>
                                <th>Price</th>
                                <th>Description</th>
                                <th>Category ID</th>
                            </thead>
                            <tbody id="tbody">
                                @if(count($products) > 0)
                                    @foreach($products as $product)
                                        <tr>
                                            <td>{{ $product->id }}</td>
                                            <td>{{ $product->name }}</td>
                                            <td>{{ $product->price }}</td>
                                            <td>{{ $product->description }}</td>
                                            <td>{{ $product->category_id }}</td>
                                        </tr>
                                    @endforeach
                                @endif
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <script>
        $(document).ready(function(){
            $("#category").on("change",function(){
                var category = $(this).val();
                $.ajax({
                    url:"{{ route('filter') }}",
                    type:"GET",
                    data:{"category":category},
                    success:function(data){
                        var products = data.products;
                        var html = "";
                        if(products.length > 0) {
                            for(let i=0;i<products.length;i++) {
                                html += '<tr>\
                                <td>'+products[i]["id"]+'</td>\
                                <td>'+products[i]["name"]+'</td>\
                                <td>'+products[i]["price"]+'</td>\
                                <td>'+products[i]["description"]+'</td>\
                                <td>'+products[i]["category_id"]+'</td>\
                                </tr>';
                            }
                        } else {
                            html += '<tr>\
                                    <td>No products found</td>\
                                </tr>';
                        }
                        $("#tbody").html(html);
                    }
                });
            });
        });
    </script>
</body>
</html>






Below File is routes\web.php File
<?php

use App\Http\Controllers\ProductController;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Route::controller(ProductController::class)->group(function () {
    Route::get("/filter", "filterProduct")->name("filter");
});







Comments

Popular posts from this blog

Eloquent Many to Many Relationship Tutorial in Laravel 11

Eloquent with JSON Data Columns Tutorial in Laravel 11

Blade Template Tutorial Three Template Inheritance in Laravel 11