Introduction
CRUD (Create, Read, Update, Delete) operations are fundamental in web applications. Laravel 11 provides powerful tools for handling CRUD operations using Eloquent ORM, Blade templates, and validation.
In this tutorial, we will build a CRUD system in Laravel 11 to manage products. Each product will have a name, description, image, and price. We will cover:
- Setting up Laravel 11
- Creating a model and migration
- Building a controller for CRUD operations
- Implementing form validation
- Handling file uploads (product images)
- Displaying products in a Blade view
By the end of this guide, you will have a fully functional product management system.
Setting Up Laravel 11
Install Laravel 11 using Composer:
composer create-project --prefer-dist laravel/laravel laravel11crud
Navigate to the project directory:
cd laravel11crud
Creating a Model and Migration
Generate a Product model with a migration:
php artisan make:model Product -m
Modify the migration file in database/migrations/
to define the table structure:
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('description');
$table->string('image')->nullable();
$table->decimal('price', 8, 2);
$table->timestamps();
});
}
Run the migration:
php artisan migrate
Creating the Product Model
Modify Product.php
located in app/Models/Product.php
:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
use HasFactory;
protected $fillable = ['name', 'description', 'image', 'price'];
}
Creating a Controller
Generate a resource controller for products:
php artisan make:controller ProductController --resource
Modify ProductController.php
in app/Http/Controllers/
:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Product;
class ProductController extends Controller
{
public function index()
{
$products = Product::all();
return view('products.index', compact('products'));
}
public function create()
{
return view('products.create');
}
public function store(Request $request)
{
$request->validate([
'name' => 'required',
'description' => 'required',
'price' => 'required|numeric',
'image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
]);
if ($request->hasFile('image')) {
$imageName = time().'.'.$request->image->extension();
$request->image->move(public_path('uploads'), $imageName);
$imagePath = 'uploads/' . $imageName;
} else {
$imagePath = null;
}
Product::create([
'name' => $request->name,
'description' => $request->description,
'image' => $imagePath,
'price' => $request->price,
]);
return redirect()->route('products.index')->with('success', 'Product created successfully');
}
public function edit(Product $product)
{
return view('products.edit', compact('product'));
}
public function update(Request $request, Product $product)
{
$request->validate([
'name' => 'required',
'description' => 'required',
'price' => 'required|numeric',
'image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
]);
if ($request->hasFile('image')) {
$imageName = time().'.'.$request->image->extension();
$request->image->move(public_path('uploads'), $imageName);
$product->image = 'uploads/' . $imageName;
}
$product->update($request->except('image'));
return redirect()->route('products.index')->with('success', 'Product updated successfully');
}
public function destroy(Product $product)
{
$product->delete();
return redirect()->route('products.index')->with('success', 'Product deleted successfully');
}
}
Defining Routes
Update routes/web.php
to include routes for CRUD operations:
use App\Http\Controllers\ProductController;
Route::resource('products', ProductController::class);
Creating Blade Templates
Product Create Form with Image Upload
Create resources/views/products/create.blade.php
:
@extends('layouts.app')
@section('content')
<h1>Add Product</h1>
<form action="{{ route('products.store') }}" method="POST" enctype="multipart/form-data">
@csrf
<input type="text" name="name" placeholder="Product Name" required>
<textarea name="description" placeholder="Product Description" required></textarea>
<input type="file" name="image">
<input type="number" step="0.01" name="price" placeholder="Price" required>
<button type="submit">Add Product</button>
</form>
@endsection
Summary
In this tutorial, we built a Laravel 11 CRUD system for managing products, including image uploads. We:
- Created a model and migration for products
- Built a controller to handle CRUD operations
- Implemented image uploads and validation
- Displayed, updated, and deleted products in Blade templates
By following these steps, you now have a fully functional CRUD system for managing products in Laravel 11. You can enhance it further by adding authentication and advanced validation.
Happy coding! 🚀