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.

Need help integrating this into your project?

Our team of expert developers can help you build your custom application from scratch.

Hire DigitalCodeLabs