← Back to all snippets
PHP

Implementing Soft Deletes and Restoring Models in Eloquent

Discover how to use Laravel's soft deleting feature to "archive" records instead of permanently deleting them, with options to restore.

// app/Models/Product.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Product extends Model
{
    use SoftDeletes;

    protected $fillable = ['name', 'price'];

    // Optionally define the column name for deleted timestamp
    // const DELETED_AT = 'deleted_on';
}

// Example Usage: Deleting
$product = App\Models\Product::find(1);
$product->delete(); // Sets 'deleted_at' timestamp, doesn't remove from DB

// Example Usage: Retrieving soft-deleted models
$allProducts = App\Models\Product::withTrashed()->get();
$deletedProducts = App\Models\Product::onlyTrashed()->get();

// Example Usage: Restoring
$deletedProduct = App\Models\Product::onlyTrashed()->find(1);
if ($deletedProduct) {
    $deletedProduct->restore(); // Sets 'deleted_at' back to null
}

// Example Usage: Force Deleting
$productToForceDelete = App\Models\Product::withTrashed()->find(2);
if ($productToForceDelete) {
    $productToForceDelete->forceDelete(); // Permanently removes from DB
}
How it works: Soft Deleting allows you to "delete" models without actually removing them from your database. Instead, a `deleted_at` timestamp is set on the record. Eloquent queries will then automatically exclude these soft-deleted records. The `withTrashed()` method allows you to retrieve all records (including soft-deleted ones), while `onlyTrashed()` retrieves only the soft-deleted ones. Models can be restored using the `restore()` method or permanently deleted with `forceDelete()`.

Need help integrating this into your project?

Our team of expert developers can help you build your custom application from scratch.

Hire DigitalCodeLabs