MÉTODOS QUIETLY DE ELOQUENT: CÓMO UTILIZARLOS

En Laravel, cada vez que se usa:
  • save
  • update
  • delete
En un modelo Eloquent, se disparan eventos como saving, updated, deleting, etc. Estos eventos activan observers, listeners, jobs en cola, emails, logs... que muchas veces resulta útil. Pero a veces no se quiere ese "ruido":
  • Evitar recursividad infinita en observers (un delete dispara otro delete..., etc...).
  • Limpiezas masivas, migraciones o seeds sin lanzar miles de notificaciones.
  • Actualizaciones internas en cron jobs o background tasks.
  • Operationes masivas.

Métodos clave "quietly"

  • saveQuietly → Guarda el modelo sin eventos (creating/created/saving/updated/etc.).
  • updateQuietly → Actualiza atributos directamente sin eventos.
  • deleteQuietly → Elimina el registro sin deleting/deleted.
  • forceDeleteQuietly → Hard delete (con SoftDeletes) sin eventos.
  • restoreQuietly → Restaura un soft-deleted sin restored event.

Ejemplos

  • Guardar cambios sin disparar observers ni jobs
    $user = User::find(1);
    $user->status = 'inactive';
    $user->saveQuietly();  // → Cambia el status... pero NADA de eventos ni emails
    
  • Actualización masiva silenciosa
    // Actualiza miles de órdenes sin disparar nada por cada una
    Order::where('status', 'pending')->updateQuietly(['status' => 'completed']);
    
  • Evitar bucles infinitos en cascades de eliminación
    // En un observer o job: borra posts de un user sin que el observer de Post se dispare
    $user->posts()->each(function ($post) {
        $post->deleteQuietly();  // Silencioso y sin recursión
    });
    
  • Eliminación permanente silenciosa
    $trashedComment = Comment::withTrashed()->find(5);
    $trashedComment->forceDeleteQuietly();  // Borra forever sin forceDeleted event
    
  • Restaurar sin ruido
    $deletedUser->restoreQuietly();  // Vuelve a la vida sin disparar restored
    
  • Antes de estos métodos, la gente usaba trucos como
    Model::withoutEvents(fn () => $model->save());