What is the difference between destroy() and delete() methods in Laravel?

Stefan Izdrail

Founder & Senior Architect · 2026-06-29

Laravel Company

Understanding the Difference Between destroy() and delete() Methods in Laravel

"I'm having a minor issue with Laravel 4. I'd like to use the delete() method on a record but for some reason it doesn't actually delete the record. destroy() does, though, so my code is good." You have encountered a common misconception between the delete() and destroy() methods in Laravel.

The Difference Between destroy() and delete() Methods Explained

Laravel provides two primary methods for handling resource deletion: delete() and destroy(). They both can be used to remove a record from the database. However, their implementation differs in terms of their features and usage. Let's take a closer look at each method.

The delete() Method:

The delete() method allows you to manually specify whether or not the model should automatically be deleted from the database. This can be set to either true (default) or false. When using this method, the corresponding foreign key will be set to null in other related models if needed.

The destroy() Method:

The destroy() method is designed with a focus on soft deletion functionality. It sets the model's deleted_at column, marking it as deleted. This means you can easily restore or permanently delete the record later if necessary.

Best Practices for Deleting Records in Laravel

When to Use destroy():

If your application requires a soft-deleting feature, using destroy() is the preferred method. It enables you to easily restore records or permanently delete them later if needed. Additionally, this approach can help in better handling of relationships and associated data.

When to Use delete():

If your application does not require a soft-deleting feature, using delete() is the more suitable option. It's faster since it doesn't involve setting up any additional columns or relationships. However, be aware that once a record has been deleted, there is no way to restore it.

Example Code Snippets

If you encounter an issue where the delete() method doesn't seem to delete the record, try using the destroy() method instead. Here are some code examples that demonstrate their usage:
// Use destroy() for soft-deleting a model
$teetime = Teetime::find($id);
if ($action === "delete") {
    $teetime->delete(); // Sets deleted_at column, soft deletes the record
}

// Use delete() if you want to permanently remove the record
$teetime = Teetime::where('date', '=', $formattedDate)->firstOrFail();
if ($action === "delete") {
    $teetime->delete(); // Permanently deletes the record, setting associated foreign keys to null
}

Conclusion

Understanding the difference between delete() and destroy() methods in Laravel is crucial for developing efficient applications. While both are used to delete records from a database, they differ in their approach to soft-deleting or permanently deleting. Ensure you use the appropriate method based on your application's requirements. For more information on database management in Laravel, visit https://laravelcompany.com/blog/database-management-in-laravel-a-guide/.