Laravel

How to use soft-delete models in Laravel 10 with Examples?

Share your learning

In Laravel, soft-deletes provide a convenient way to mark records as deleted without actually removing them from the database. 

This feature is particularly useful when dealing with data that may need to be restored or used for historical purposes. 

With Laravel 10, the soft-delete functionality has been further improved, providing developers with even more flexibility and control. 

In this article, we will explore what soft-deletes are in Laravel, why we need them, and how to implement them in a practical example project.

What is Soft-Delete in Laravel?

Soft-deletes in Laravel allow you to mark records as “deleted” without permanently removing them from the database. When a record is soft-deleted, Laravel sets a timestamp in a dedicated column, typically named deleted_at, indicating the time of deletion. 

The soft-delete feature in Laravel is achieved by utilizing the SoftDeletes trait provided by the framework. This trait adds the necessary functionality to handle soft-deletes automatically.

Why Do We Need Soft-Deletes?

Soft-deletes offer several advantages over hard-deletes, where records are permanently removed from the database. Here are some of the reasons why soft-deletes are beneficial:

1. Data Recovery and Auditing

By utilizing soft-deletes, you retain the ability to recover deleted data if needed. By removing the deleted_at timestamp, you can easily restore soft-deleted records, enabling a more flexible data recovery process. Additionally, soft-deletes enable you to maintain a historical record of data changes, which can be valuable for auditing purposes.

2. Data Integrity

Soft-deletes ensure that relationships between models remain intact. When deleting a parent model, the system will automatically soft-delete all the child models. With hard-deletes, you would need to manually handle the deletion of related records, which can be error-prone and time-consuming.

3. User Experience

Soft-deletes offer a better user experience by allowing users to recover accidentally deleted data. It provides an extra layer of protection, reducing the risk of data loss due to accidental deletions. Users can easily undo a soft-delete operation without having to rely on database backups or other complex recovery processes.

Example Project: Implementing Soft-Deletes in Laravel 10

To demonstrate the use case of soft-deletes in Laravel 10, let’s consider a simple example project involving a blog application with Post and Comment models. We will enable soft-deletes on both models and explore how they can be utilized.

Create a New Laravel Project

Start by creating a new Laravel project using the Laravel installer or Composer:
bash

laravel new blog-app

Generate the Models and Migrations

Generate the Post and Comment models and their respective migrations using Artisan’s make:model and make:migration commands:

php artisan make:model Post -m

php artisan make:model Comment -m

Update the Migrations

Open the generated migration files for both Post and Comment models and add the necessary columns. In this case, we need to include the deleted_at column for soft-deletes. Update the migration files as follows:

// database/migrations/2023_07_02_create_posts_table.php
Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('content');
    $table->softDeletes(); // Add this line
    $table->timestamps();
});

// database/migrations/2023_07_02_create_comments_table.php
Schema::create('comments', function (Blueprint $table) {
    $table->id();
    $table->unsignedBigInteger('post_id');
    $table->text('content');
    $table->softDeletes(); // Add this line
    $table->timestamps();

    $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
});

Update the Models

Open the Post and Comment models and import the SoftDeletes trait from Laravel. Additionally, make sure to include the $dates property to treat the deleted_at column as a DateTime instance. Update the models as follows:

// app/Models/Post.php
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes;

    protected $dates = ['deleted_at'];

    // Rest of the model code...
}

// app/Models/Comment.php
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Comment extends Model
{
    use SoftDeletes;

    protected $dates = ['deleted_at'];

    // Rest of the model code...
}

Migrate the Database

Run the database migrations to create the necessary tables:

php artisan migrate

Testing Soft-Deletes

Now, let’s test the soft-deletes functionality. In your desired route or controller method, you can use the following code to create, retrieve, soft-delete, and restore posts and comments:

// routes/web.php or your controller method

// Create a new post
$post = Post::create([
    'title' => 'Example Post',
    'content' => 'Lorem ipsum dolor sit amet.',
]);

// Create a new comment for the post
$comment = Comment::create([
    'post_id' => $post->id,
    'content' => 'This is a comment.',
]);

// Soft-delete the post
$post->delete();

// Retrieve all posts (excluding soft-deleted)
$posts = Post::all();

// Retrieve all comments (including soft-deleted)
$comments = Comment::withTrashed()->get();

// Restore the soft-deleted post
$post->restore();

With this code, you can create a post, associate a comment with it, soft-delete the post, retrieve all posts (excluding soft-deleted ones), retrieve all comments (including soft-deleted ones), and restore the soft-deleted post.

Conclusion

By following the example project outlined in this guide, you can get hands-on experience with soft-deletes in Laravel 10 and incorporate this feature into your own projects. So go ahead, start leveraging soft-deletes and unlock the benefits of non-destructive data management in your Laravel applications!

Satpal

Recent Posts

How to Switch PHP Versions in XAMPP Easily: Managing Multiple PHP Versions on Ubuntu

Today we are going to learn about managing multiple PHP versions on ubuntu with xampp.…

1 year ago

How to Use Coding to Improve Your Website’s SEO Ranking?

Let's understand about how to use coding to improve your website's SEO. In today’s computerized…

1 year ago

Most Important Linux Commands for Web Developers

Let's understand the most important linux commands for web developers. Linux, as an open-source and…

1 year ago

Top 75+ Laravel Interview Questions Asked by Top MNCs

Today we are going to discuss top 75+ Laravel interview questions asked by top MNCs.Laravel,…

1 year ago

Mailtrap Integration for Email Testing with Laravel 10

Today we will discuss about the Mailtrap integration with laravel 10 .Sending and receiving emails…

1 year ago

Firebase Cloud Messaging (FCM) with Ionic 6: Push Notifications

Today we are going to integrate FCM (Firebase Cloud Messaging) push notifications with ionic application.Firebase…

1 year ago