How to Implement Soft Deletes in LeafPHP (Step-by-Step Guide)

Soft deletes allow you to “delete” records without permanently removing them from the database. Instead of deleting a row, a deleted_at timestamp is set. This makes it possible to restore data later.

In this guide, I’ll show you how I implemented soft deletes in LeafPHP (MVC + Eloquent Model).


🚀 Step 1: Update the Members Schema

First, I modified my members.yml schema file.

After running:

php leaf db:migrate members

(I reset the table during development)

I manually added the following to my YAML schema:

deleted_at:
    type: timestamp
    nullable: true

soft_deletes: true

What this does:

  • Adds a nullable deleted_at column
  • Enables soft delete support inside the model

🚀 Step 2: Update the Model

Inside my Member model, I added the SoftDeletes trait:

use Illuminate\Database\Eloquent\SoftDeletes;

class Member extends Model
{
    use SoftDeletes;
}

This enables all soft delete functionality.


🚀 Step 3: Run Migration Again

After modifying the schema:

php leaf db:migrate members

Then I seeded the table again to restore test data.

Now the table structure includes:

deleted_at TIMESTAMP NULL

Everything is ready 🎉


✅ How Soft Delete Works in LeafPHP

When you call:

$member->delete();

It does NOT remove the row.

Instead, it runs something like:

UPDATE members SET deleted_at = CURRENT_TIMESTAMP WHERE id = ?

The record still exists — just marked as deleted.


📘 Useful Soft Delete Methods

Here are the methods I learned and tested:


🔹 Get Active (Non-Deleted) Records

Member::all();

By default, this excludes soft deleted records.


🔹 Find a Specific Member

Member::find($id);

Only finds non-deleted records.


🔹 Save Changes

$member->save();

🔹 Soft Delete a Record

$member->delete();

Sets deleted_at timestamp.


🔹 Get Only Soft Deleted Records

Member::onlyTrashed()->get();
Member::onlyTrashed()->find($id);

🔹 Get All Records (Active + Deleted)

Member::withTrashed()->get();
Member::withTrashed()->find($id);

🔹 Restore a Soft Deleted Record

$member->restore();

This sets deleted_at back to NULL.


🔹 Permanently Delete a Record

$member->forceDelete();

This removes the row completely from the database.

⚠ Use this carefully.


🎯 Summary

To enable soft deletes in LeafPHP:

  1. Add deleted_at column in your schema
  2. Add soft_deletes: true in YAML
  3. Use SoftDeletes trait in your model
  4. Run migration
  5. Use built-in Eloquent methods like:
    • delete()
    • restore()
    • forceDelete()
    • onlyTrashed()
    • withTrashed()

Soft deletes are safer than permanent deletes and allow easy recovery of data.