Laravel's SoftDeletes trait adds a deleted_at timestamp column and automatically excludes trashed records from queries.
// In your migration
Schema::table('articles', function (Blueprint $table) {
$table->softDeletes(); // adds deleted_at nullable timestamp
});
// app/Models/Article.php
use Illuminate\Database\Eloquent\SoftDeletes;
class Article extends Model
{
use SoftDeletes;
}
$article = Article::find(1);
// Soft delete — sets deleted_at, excluded from future queries
$article->delete();
// Query trashed records
$trashed = Article::onlyTrashed()->get();
// Include trashed in results
$all = Article::withTrashed()->get();
// Restore a soft-deleted record
$article->restore();
// Permanently delete
$article->forceDelete();
// In the Observer, manually soft-delete children
public function deleted(Article $article): void
{
$article->comments()->delete(); // soft-deletes if Comment uses SoftDeletes
}
All Comments