CARACTERÍSTICAS INFRAVALORADAS DE LARAVEL
Laravel está lleno de herramientas potentes, pero muchas veces nos centramos solo en lo más evidente como Eloquent, Blade, colas, etc. Mientras tanto, hay una serie de métodos y funcionalidades que, aunque parecen sencillos, pueden mejorar muchísimo la legibilidad, el rendimiento y la mantenibilidad del código.
"when()" Consultas condicionales limpias
¿Cansado de llenar tus consultas de if-else? El método "when()" permite escribir consultas condicionales de forma elegante y legible.
User::query()
->when($active, function ($query) {
$query->where('active', true);
})
->when($role, function ($query) use ($role) {
$query->where('role', $role);
})
->get();
O de forma aún más compacta con arrow functions:
User::query()
->when($active, fn ($q) => $q->where('active', true))
->when($request->filled('search'), fn ($q) => $q->where('name', 'like', "%{$request->search}%"))
->get();
Ventaja: El código queda mucho más limpio y fácil de mantener.
"exists()" Comprobar existencia sin cargar datos
Muchos desarrolladores usan "count()" para saber si existe un registro. Eso es ineficiente. Laravel ofrece el método "exists()", que es más rápido porque no necesita contar todos los registros.
if (User::where('email', $email)->exists()) {
// El usuario ya existe
}
Comparado con:
// Menos eficiente
if (User::where('email', $email)->count() > 0) {
// ...
}
Ideal para: validaciones, comprobaciones de unicidad o cualquier lógica donde solo necesites saber si existe o no.
"upsert()" Insertar o actualizar de una sola vez
Cuando se necesitan insertar varios registros y, si ya existen, actualizarlos, normalmente se acaba haciendo bucles o consultas separadas. Esto se resuelve con "upsert()" en una sola consulta eficiente.
User::upsert(
[
['email' => 'ana@ejemplo.com', 'name' => 'Ana', 'updated_at' => now()],
['email' => 'luis@ejemplo.com', 'name' => 'Luis', 'updated_at' => now()],
],
['email'], // Columnas únicas para detectar duplicados
['name', 'updated_at'] // Columnas que se actualizarán si ya existe
);
Perfecto para: sincronizaciones, importaciones o actualizaciones masivas.
"lazyById()" Procesar grandes volúmenes de datos sin agotar la memoria
Cuando trabajas con miles o cientos de miles de registros, usar "get()" o" ll()" puede hacer que la aplicación se quede sin memoria. "lazyById()" procesa los datos en trozos de forma muy eficiente.
User::lazyById(1000)->each(function ($user) {
// Procesar cada usuario
$user->sendNewsletter();
});
A diferencia de "chunk()", "lazyById()" utiliza un cursor y es especialmente útil cuando los registros se van eliminando o modificando durante el proceso.
Usarlo en exportaciones, envíos masivos de correos, migraciones de datos o cualquier tarea que involucre grandes volúmenes de información.
Route Model Binding
Muchos desarrolladores siguen haciendo lo siguiente en los controladores:
public function show($id)
{
$user = User::findOrFail($id);
return view('users.show', compact('user'));
}
Con Route Model Binding se puede eliminar esa línea por completo:
// routes/web.php
Route::get('/users/{user}', [UserController::class, 'show']);
// UserController.php
public function show(User $user)
{
return view('users.show', compact('user'));
}
Laravel se encarga automáticamente de buscar el modelo y devolver un 404 si no existe.
También puedes personalizar la clave de búsqueda:
Route::get('/users/{user:username}', [UserController::class, 'show']);
Resultado: controladores más limpios y menos código repetitivo.
Conclusión
Estas funcionalidades no son las más “llamativas” de Laravel, pero tienen un impacto enorme en la calidad del código:
- Más legibilidad
- Mejor rendimiento
- Menos código repetitivo
- Mayor facilidad de mantenimiento