PHP
Performing Batch Updates and Deletes with Laravel Eloquent
Learn how to efficiently update or delete multiple records in Laravel Eloquent without retrieving each model individually, significantly improving performance for bulk operations.
<?php
namespace App\Http\Controllers;
use App\Models\Product;
use Illuminate\Http\Request;
class ProductController extends Controller
{
/**
* Update multiple products based on a condition.
* Does not trigger model events for individual models.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function bulkUpdate(Request $request)
{
// Example: Mark all 'pending' products as 'published' for a specific category
$updatedRows = Product::where('status', 'pending')
->where('category_id', $request->input('category_id'))
->update(['status' => 'published', 'updated_at' => now()]);
return response()->json([
'message' => "{$updatedRows} products updated successfully."
]);
}
/**
* Delete multiple products based on a condition.
* Does not trigger model events for individual models (e.g., 'deleting', 'deleted').
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function bulkDelete(Request $request)
{
// Example: Delete all products older than 30 days and with low stock
$deletedRows = Product::where('created_at', '<', now()->subDays(30))
->where('stock', '<', 5)
->delete(); // For soft deletes, this sets 'deleted_at'
// For force deleting soft-deleted models:
// $forceDeletedRows = Product::onlyTrashed()
// ->where('deleted_at', '<', now()->subDays(7))
// ->forceDelete();
return response()->json([
'message' => "{$deletedRows} products deleted successfully."
]);
}
}
How it works: This snippet illustrates how to perform efficient batch updates and deletes using Laravel Eloquent's `update()` and `delete()` methods on a query builder instance. Unlike retrieving and iterating over individual models, these methods execute a single SQL query, making them much faster for large datasets. It's important to note that these bulk operations do not hydrate models or dispatch individual model events (e.g., `saving`, `deleted`) for each affected record.