CRUD Operations Using Laravel Livewire: Step-by-Step Guide

CRUD, or Create, Read, Update, and Delete, forms the fundamentals building blocks of web applications. In Laravel websites, handling these operations efficiently translates to dynamic and interactive user experiences. They make up for a solid foundation when creating robust, scalable, Laravel sites and applications.

When it comes to executing CRUD operations, Laravel Livewire offers a streamlined option. It blends Laravel with the reactivity of frontend libraries. So you can build interactive UIs with relative ease.

In this blog, I’ll show you how the Laravel developers perform CRUD operations using Livewire. But before starting with that, let’s understand what Livewire is.

What is Laravel Livewire?

Livewire is a full-stack development framework built on top of Laravel. It simplifies the creation of dynamic user interfaces without requiring extensive JavaScript. You can build modern, reactive, and dynamic websites using PHP and Laravel Blade templates. It can be seamlessly integrated with Laravel, simplifying the web app development process.

Key Features of Laravel Livewire

  • Reactivity: Livewire provides real-time, reactive updates to your UI, similar to JavaScript frameworks like Angular or React or Vue. The key point is you can do it without the need to write any JavaScript.
  • Ease of Use: It leverages Laravel’s Blade templates and syntax, making it simple for developers already familiar with Laravel.
  • Component-Based: It works on component-based architecture. That means each part of your interface has its own component. This promotes code reuse and maintainability.
  • Server-Driven: Instead of handling the reactivity on the client side with JavaScript, Livewire handles it on the server side. When a user interacts with a site, it sends an AJAX request to the server, and the resulting HTML is sent back to the client.
  • No Build Step: Unlike other web development frameworks, Livewire does not require a build step. You write PHP and Blade templates, and Livewire handles the rest.
  • Seamless Integration with Laravel: Being part of the Laravel ecosystem, Livewire integrates seamlessly with Laravel. That lets you leverage the existing features of Laravel, such as Eloquent ORM, Laravel validation, and more.

These features of Livewire allow Laravel development experts to build dynamic and interactive websites efficiently. The ease of using Livewire lets them write optimized code, leading to faster site loading and enhancing user experience.

Want the best Laravel development services?

Why Use Laravel Livewire for CRUD Operations?

Using Livewire for CRUD operations in Laravel offers advantages like efficient development experience and improved site performance. Here are some key reasons to use Livewire for CRUD operations:

  • Simplified Development: Livewire removes the need for complex JavaScript, allowing developers to focus on PHP logic for building CRUD operations. This accelerates development and reduces errors.
  • Enhanced User Experience: It provides real-time updates without full page reloads, creating a smooth and responsive user interface. Users can directly interact with elements, making the application intuitive. 
  • Improved Efficiency: By handling AJAX requests and state management, Livewire reduces the effort of writing boilerplate code. This improves the efficiency of building CRUD features faster and with less effort.
  • Full-Stack Development: Using Livewire, you can manage both front-end and back-end logic for a single component. This improves code organization, maintainability, and web development process.
  • Leveraging Laravel’s Strengths: Built on top of Laravel, it seamlessly integrates with Laravel’s features like Eloquent, authentication, and authorization. This lets you build secure, scalable, and feature-rich CRUD applications.

It combines Laravel’s back-end capabilities with real-time, reactive front-end features. This makes Livewire a preferred choice by our Laravel development company for building dynamic sites.

CRUD Operations Using Laravel Livewire

Before diving into the setup for CRUD operations using Laravel Livewire, ensure you meet the following prerequisites:

  • PHP 8.1 or higher is recommended.
  • Composer, a dependency manager for PHP
  • Laravel 9.x or higher.
  • A database server (MySQL, PostgreSQL, SQLite, or SQL Server).

Step 1: Install Laravel

This involves using Composer to create a fresh Laravel application that will serve as the base for your CRUD operations. To create a new Laravel project, open your terminal and run the following command:

composer create-project --prefer-dist laravel/laravel your-project-name

Here, we created a new Laravel with all the default configurations and file structures needed to begin development.

Step 2: Add Livewire

Add Livewire to your Laravel project to enable the development of reactive components. You can run the following Composer command to install Livewire:

composer require livewire/livewire

Then, publish Livewire’s assets to make them available in your project:

php artisan livewire:publish --assets

Now, Livewire has been installed, and its assets have been published. That makes Livewire components and functionalities available in your Laravel project.

Step 3: Create Livewire Components

Generate Livewire components to handle the CRUD operations. These components will include both a class and a Blade view. For example, create a Livewire component named ItemManager:

php artisan make:livewire ItemManager

A Livewire component comprises a class for handling backend logic and a Blade view for the frontend interface.

Step 4: Set Up the Database

Configure your database connection and create a migration for the table that will store your data. This step prepares the database for CRUD operations.

Firstly, we need to edit the .env file to configure your database connection:

DB_CONNECTION=mysql

DB_HOST=127.0.0.1

DB_PORT=3306

DB_DATABASE=your_database

DB_USERNAME=your_username

DB_PASSWORD=your_password

Now, the database connection is successfully configured.

Step 5: Generate a model

To generate a model for your items, run the following code:

php artisan make:model Item -m

Step 6: Set Migration

Define the table structure in the migration file located in database/migrations/xxxx_xx_xx_create_items_table.php:

public function up()

{

    Schema::create('items', function (Blueprint $table) {

        $table->id();

        $table->string('name');

        $table->text('description')->nullable();

        $table->timestamps();

    });

}

Run the migration to create the table:

php artisan migrate

The database is configured, and the necessary table for storing items is created using migrations.

Step 7: Create Operation

Develop the logic and view for creating new records. This involves defining methods in the Livewire component and creating a form for user input. To do so, edit the Livewire component class (app/Http/Livewire/ItemManager.php) to include the store method:

public function store()

{

    $this->validate([

        'name' => 'required|string|max:255',

        'description' => 'nullable|string',

    ]);

    Item::create([

        'name' => $this->name,

        'description' => $this->description,

    ]);

    session()->flash('message', 'Item Created Successfully.');

    $this->resetInputFields();

}

private function resetInputFields()

{

    $this->name = '';

    $this->description = '';

    $this->itemId = '';

}

Create the form for creating items in the Blade view (resources/views/livewire/item-manager.blade.php):

<form wire:submit.prevent="store">

    <div>

        <label for="name">Name:</label>

        <input type="text" id="name" wire:model="name">

        @error('name') <span class="error">{{ $message }}</span> @enderror

    </div>

    <div>

        <label for="description">Description:</label>

        <textarea id="description" wire:model="description"></textarea>

        @error('description') <span class="error">{{ $message }}</span> @enderror

    </div>

    <button type="submit">Save</button>

</form>

The create functionality is implemented, allowing users to add new records. The form is set up to handle input and data validation.

Step 8: Read Operation

Displaying the list of existing records involves fetching records from the database and displaying them in the Blade view.

To fetch and display the items in the render method of the Livewire component:

public function mount()

{

    $this->items = Item::all();

}

Update the Blade view to include a table displaying the items:

@if ($items->count())

    <table>

        <thead>

            <tr>

                <th>Name</th>

                <th>Description</th>

                <th>Actions</th>

            </tr>

        </thead>

        <tbody>

            @foreach ($items as $item)

                <tr>

                    <td>{{ $item->name }}</td>

                    <td>{{ $item->description }}</td>

                    <td>

                        <button wire:click="edit({{ $item->id }})">Edit</button>

                        <button wire:click="delete({{ $item->id }})">Delete</button>

                    </td>

                </tr>

            @endforeach

        </tbody>

    </table>

@endif

The read operation is implemented, allowing users to view a list of existing records in a table format.

Step 9: Update Operation

To add the update existing records functionality, implement the update methods to the Livewire component:

public function edit($id)

{

    $item = Item::findOrFail($id);

    $this->itemId = $id;

    $this->name = $item->name;

    $this->description = $item->description;

    $this->updateMode = true;

}

public function update()

{

    $this->validate([

        'name' => 'required|string|max:255',

        'description' => 'nullable|string',

    ]);

    $item = Item::find($this->itemId);

    $item->update([

        'name' => $this->name,

        'description' => $this->description,

    ]);

    $this->updateMode = false;

    session()->flash('message', 'Item Updated Successfully.');

    $this->resetInputFields();

}

Update the Blade view to include the edit form:

@if ($updateMode)

    <form wire:submit.prevent="update">

        <input type="hidden" wire:model="itemId">

        <div>

            <label for="name">Name:</label>

            <input type="text" id="name" wire:model="name">

            @error('name') <span class="error">{{ $message }}</span> @enderror

        </div>

        <div>

            <label for="description">Description:</label>

            <textarea id="description" wire:model="description"></textarea>

            @error('description') <span class="error">{{ $message }}</span> @enderror

        </div>

        <button type="submit">Update</button>

    </form>

@endif

The update functionality is added, allowing users to modify existing records. The view is updated to handle the editing process.

Step 10: Delete Operation

Implement the logic to delete records from the database. That involves creating a method for deleting records and adding corresponding buttons in the view. Here is how you can add the delete method to the Livewire component:

public function delete($id)

{

    Item::destroy($id);

    session()->flash('message', 'Item Deleted Successfully.');

}

To add the delete buttons in the Blade view:

<button wire:click="delete({{ $item->id }})">Delete</button>

Now, the delete functionality is implemented, allowing users to remove records. The view is updated to include delete buttons.

Once you are done adding CRUD operations, test them to ensure they work as expected. Test it by creating, updating, and deleting records. If you are still facing any problems implementing CRUD functionality on your site, consider hiring Laravel developers.

FAQs About CRUD Operations Using Laravel Livewire

How do Livewire components work?
Livewire components consist of a PHP class and a Blade view. The class handles backend logic, while the Blade view handles the frontend interface. They communicate seamlessly to create reactive applications.
Can Livewire be used with JavaScript frameworks or libraries?
Yes, Livewire can integrate with JavaScript frameworks and libraries like Alpine.js. This allows you to enhance your Livewire components with additional JavaScript functionality.
How can I paginate records in Livewire?
Use Livewire’s pagination features by adding Use WithPagination to your component class. Update your Blade view to include pagination controls.

Conclusion

Laravel Livewire is a simplified alternative to the traditional JavaScript approach. Its component-based architecture and reactive updates let you create dynamic sites effectively. For the best CRUD operations, you just need to install Livewire, create components, generate models, and set migration.

Further, to add the CRUD operation, you need to implement it by adding advanced features. Once you add it, tests that create, read, update, and delete operations work as expected. To build a site that handles CRUD operations efficiently and is also dynamic, hire Laravel professionals.

Need help with your Laravel project?

author
Mayur Upadhyay is a tech professional with expertise in Shopify, WordPress, Drupal, Frameworks, jQuery, and more. With a proven track record in web development and eCommerce development.

Leave a comment