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_atcolumn - 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:
- Add
deleted_atcolumn in your schema - Add
soft_deletes: truein YAML - Use
SoftDeletestrait in your model - Run migration
- Use built-in Eloquent methods like:
delete()restore()forceDelete()onlyTrashed()withTrashed()
Soft deletes are safer than permanent deletes and allow easy recovery of data.
