INCREMENTO Y DECREMENTO CON ELOQUENT: LA FORMA MÁS EFICIENTE DE ACTUALIZAR CONTADORES

En aplicaciones Laravel, es muy común necesitar incrementar o decrementar valores numéricos en la base de datos como vistas de un post, likes, stock de productos, saldo de billetera, intentos de login, etc. Aunque se podría hacer cargando el modelo, modificándolo y guardándolo, Laravel ofrece métodos mucho más eficientes que son "increment()" y "decrement()". Usar "increment()" y "decrement()" no solo hace que el código más limpio y legible, sino que también mejora significativamente el rendimiento y la seguridad de la aplicación.

Incremento y decremento simple

Incrementar

// Incrementar en 1 (valor por defecto)
User::where('id', 1)->increment('points');

// Incrementar en una cantidad específica
User::where('id', 1)->increment('points', 5);

Decrementar

// Decrementar en 1
User::where('id', 1)->decrement('points');

// Decrementar en una cantidad específica
User::where('id', 1)->decrement('points', 5);
  • No es necesario cargar el modelo en memoria con "find()".
  • Ejecutar una sola consulta SQL atómica.
  • Mucho más rápido y seguro en entornos de alta concurrencia.

Incremento y decremento múltiples columnas

// Incrementar múltiples columnas
User::where('id', 1)->increment([
    'points' => 10,
    'coins'  => 5,
]);

// Decrementar múltiples columnas
Product::where('id', $id)->decrement([
    'stock' => 3,
    'sold'  => 2,
]);

SQL generados

//Incremento
UPDATE `users` 
SET `points` = `points` + 5 
WHERE `id` = 1;

//Decremento
UPDATE `users` 
SET `points` = `points` - 3 
WHERE `id` = 1;
En escenarios de alta concurrencia, como tiendas en línea, se puede combinat "increment()" con "where" para mayor seguridad:

Order::where('id', $orderId)
     ->increment('total_quantity', $qty);
También se pueden usarl directamente en relaciones:

$post->increment('views');