Laravel 12 CRUD Application with Image Upload | asadmukhtar.info
Step-by-Step Guide to Setting Up Authentication in Laravel 12 with Breeze   |   Manual Authentication in Laravel 12: Step-by-Step Guide   |   How to Build a REST API in Laravel 12 with Sanctum   |   Laravel 12 CRUD Application with Image Upload   |   Laravel 12 Multi-Auth System: Admin & User Login   |   How to Integrate Stripe Payment Gateway in Laravel 12   |   Building a Role-Based Access Control (RBAC) in Laravel 12   |   How to Use Laravel 12 Queues and Jobs for Background Tasks   |   Laravel 12 Livewire CRUD Example with Validation   |   Email Verification and Password Reset in Laravel 12   |   How to Use Laravel 12 API with Vue.js 3   |   Laravel 12 AJAX CRUD with jQuery and Bootstrap   |   Laravel 12 Multi-Language Website Setup   |   React Best Practices for 2025: Performance, SEO, and Scalability   |   How to Build a Full-Stack MERN App: A Step-by-Step Guide   |   React State Management: Redux vs. Context API vs. Recoil   |   Server-Side Rendering (SSR) in React with Next.js for SEO   |   How to Optimize React Apps for Faster Load Times   |   Building a REST API with Node.js and Express for a React App   |   Integrating JWT Authentication in React and Node.js (MERN Stack)   |   Real-time Chat App with React, Node.js, and Socket.io   |   How to Deploy a MERN Stack Application on AWS or Vercel   |   Connecting React Frontend to a Node.js Backend with Axios   |   Laravel Implement Flash Messages Example   |   How to integrate Angular 19 with Node.js and Express for full-stack development   |   Best practices for connecting Angular 19 frontend with Laravel API   |   Step-by-step guide to upgrading an existing project to Angular 19   |   How to implement authentication in Angular 19 using JWT and Firebase   |   Optimizing server-side rendering in Angular 19 with route-level render modes   |   Using Angular 19 signals for state management in large applications   |   How to create standalone components in Angular 19 for modular architecture   |   Building a CRUD application in Angular 19 with MongoDB and Express   |   Implementing lazy loading in Angular 19 to improve performance   |   How to integrate Angular 19 with GraphQL for efficient data fetching   |   Vue 3 Composition API vs Options API: A Comprehensive Comparison   |   Fetching and Displaying Data from APIs in Vue.js with Axios   |   Building a Todo App in Vue.js with Local Storage Integration   |   Handling Forms and Validation in Vue.js Using VeeValidate   |   State Management in Vue.js Applications Using Vuex   |   10 Most Important Tasks Every MERN Stack Developer Should Master   |   How to Build a Full-Stack CRUD App with MERN Stack   |   Best Practices for Authentication & Authorization in MERN Stack   |   1. MEAN Stack vs. MERN Stack: Which One Should You Choose in 2025   |   Top 10 Node.js Best Practices for Scalable and Secure Applications   |   How to Build a REST API with Laravel and Node.js (Step-by-Step Guide)   |   Mastering Angular and Express.js for Full-Stack Web Development   |   Top 10 Daily Tasks Every Frontend Developer Should Practice   |   Essential Backend Development Tasks to Boost Your Coding Skills   |   Real-World Mini Projects for Practicing React.js Daily   |   Laravel Developer Task List: Beginner to Advanced Challenges   |   How to Assign Effective Tasks to Your Intern Developers   |   10 Must-Try Tasks to Master JavaScript Fundamentals   |   Practical CSS Challenges That Improve Your UI Design Skills   |   Top Tasks to Learn API Integration in React and Angular   |   Best Task Ideas for a 30-Day Web Development Challenge   |   Top Git and GitHub Tasks Every Developer Should Know   |   30-Day Task Plan for Web Development Interns   |   Weekly Task Schedule for Junior Developers in a Startup   |   How to Track Progress with Development Tasks for Interns   |   What Tasks Should You Give to Interns in a MERN Stack Project   |   Build These 5 Projects to Master React Routing   |   Task-Based Learning: Become a Full-Stack Developer in 90 Days   |   Daily Coding Tasks That Will Sharpen Your Logical Thinking   |   Top 7 Backend Task Ideas to Practice With Node.js and MongoDB   |  

Laravel 12 CRUD Application with Image Upload

Laravel 12 makes it easy to build CRUD applications with file and image uploads using its powerful Eloquent ORM and built-in file storage system. In this tutorial, we’ll create a CRUD application where users can upload images along with their data.

By the end of this guide, you will learn:
✅ How to set up a Laravel 12 project
✅ How to create a model, migration, and controller
✅ How to upload and validate images
✅ How to perform CRUD operations (Create, Read, Update, Delete)
✅ How to display images in Blade templates

Let’s get started! 🚀

Step 1: Install Laravel 12

Make sure you have Composer installed. Then, create a new Laravel 12 project:

composer create-project laravel/laravel laravel12-crud
cd laravel12-crud

Run the Laravel development server:

php artisan serve

Step 2: Set Up Database

Configure your .env file for database connection:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=crud_db
DB_USERNAME=root
DB_PASSWORD=

Run the migration command to create the default tables:

php artisan migrate

Step 3: Create a Model, Migration, and Controller

Generate a model with a migration and controller for storing images:

php artisan make:model Post -mcr

Now, open the migration file inside database/migrations/ and update the up() method:

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->text('description');
        $table->string('image')->nullable();
        $table->timestamps();
    });
}

Run the migration:

php artisan migrate

Step 4: Configure Image Upload in Model

Modify the Post.php model file:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;
    
    protected $fillable = ['title', 'description', 'image'];
}

Step 5: Set Up Routes in web.php

Modify the routes/web.php file:

use App\Http\Controllers\PostController;

Route::resource('posts', PostController::class);

Step 6: Implement CRUD Logic in PostController.php

Modify app/Http/Controllers/PostController.php:

Display All Posts

public function index()
{
    $posts = Post::latest()->paginate(5);
    return view('posts.index', compact('posts'));
}

Show Create Form

public function create()
{
    return view('posts.create');
}

Store Post with Image

public function store(Request $request)
{
    $request->validate([
        'title' => 'required|max:255',
        'description' => 'required',
        'image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048'
    ]);

    $data = $request->all();

    if ($request->hasFile('image')) {
        $imageName = time() . '.' . $request->image->extension();
        $request->image->move(public_path('uploads'), $imageName);
        $data['image'] = $imageName;
    }

    Post::create($data);

    return redirect()->route('posts.index')->with('success', 'Post created successfully!');
}

Show Edit Form

public function edit(Post $post)
{
    return view('posts.edit', compact('post'));
}

Update Post with Image

public function update(Request $request, Post $post)
{
    $request->validate([
        'title' => 'required|max:255',
        'description' => 'required',
        'image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048'
    ]);

    $data = $request->all();

    if ($request->hasFile('image')) {
        // Delete old image
        if ($post->image) {
            unlink(public_path('uploads/' . $post->image));
        }

        $imageName = time() . '.' . $request->image->extension();
        $request->image->move(public_path('uploads'), $imageName);
        $data['image'] = $imageName;
    }

    $post->update($data);

    return redirect()->route('posts.index')->with('success', 'Post updated successfully!');
}

Delete Post

public function destroy(Post $post)
{
    if ($post->image) {
        unlink(public_path('uploads/' . $post->image));
    }

    $post->delete();
    return redirect()->route('posts.index')->with('success', 'Post deleted successfully!');
}

Step 7: Create Blade Views

Create a Post Form (resources/views/posts/create.blade.php)

<form action="{{ route('posts.store') }}" method="POST" enctype="multipart/form-data">
    @csrf
    <input type="text" name="title" placeholder="Title">
    <textarea name="description" placeholder="Description"></textarea>
    <input type="file" name="image">
    <button type="submit">Submit</button>
</form>

Display Posts (resources/views/posts/index.blade.php)

@foreach ($posts as $post)
    <h2>{{ $post->title }}</h2>
    <p>{{ $post->description }}</p>
    @if($post->image)
        <img src="{{ asset('uploads/' . $post->image) }}" width="100">
    @endif
    <a href="{{ route('posts.edit', $post->id) }}">Edit</a>
    <form action="{{ route('posts.destroy', $post->id) }}" method="POST">
        @csrf @method('DELETE')
        <button type="submit">Delete</button>
    </form>
@endforeach

Conclusion

In this tutorial, we successfully built a Laravel 12 CRUD application with image upload. You learned:
✅ How to set up Laravel and connect a database
✅ How to create models, migrations, and controllers
✅ How to upload images and display them
✅ How to perform CRUD operations in Laravel

Now, you can extend this application by adding user authentication, API integration, or multiple file uploads. 🚀


Related Tutorials

Laravel 12 CRUD Application with Image Upload
How to Use Laravel 12 Queues and Jobs for Background Tasks
How to Use Laravel 12 API with Vue.js 3
Laravel 12 AJAX CRUD with jQuery and Bootstrap
Laravel 12 Multi-Language Website Setup
How to Build a REST API with Laravel and Node.js (Step-by-Step Guide)
Laravel Developer Task List: Beginner to Advanced Challenges