En el Laravel Tip del día de hoy vamos a ver como insertar registros con Transacciones en Eloquent, algo muy útil si queremos asegurarnos que los datos se guarden correctamente en nuestra base de datos.
¿Qué son las Transacciones en Base de Datos?
Las transacciones en base de datos son un grupo de consultas SQL que se ejecutan en un «ambiente controlado». Todas las consultas contenidas en una transacciones se ejecutan pero el impacto de cada una de ellas se ve reflejado cuando todas las consultas se ejecutaron correctamente. Si alguna de ellas falla, los impactos no se ven reflejados en la base de datos.
Transacciones en Base de Datos Distribuidas
Las transacciones no tienen restricciones sobre donde ejecutarse. No están limitadas a ejecutarse sobre una única base de datos, ni sobre una única tabla. Podemos ejecutar transacciones en distintas tablas del mismo esquema y hasta en servidores de base de datos distintos, a esto se lo llama Transacciones en Base de Datos Distribuidas.
¿Cómo crear Transacciones en Laravel?
En Laravel tenemos varias formas de crear transacciones, la mas común es utilizar el método transaction
de la fachada DB
donde, el primer argumento debe ser una función anónima y dentro de ella, definimos todas las consultas.
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });
Si alguna de las consultas no se ejecuta correctamente, se produce una excepción y ninguna de ellas se impactan en la base de datos.
Otra forma es ejecutar las transacciones «manualmente».
DB::beginTransaction(); try { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); DB::commit(); } catch (\Exception $e) { DB::rollback(); }
De esta forma tenemos un control mayor en la excepción y en la ejecución de las transacciones, pero el código no nos queda muy limpio que digamos.
¡Vamos al tip!
Guardar registros con Transacciones en Eloquent
Muchas veces queremos guardar datos en nuestra Base de Datos con el método save
utilizando transacciones y hacemos uso de la fachada DB
como vimos en los ejemplos anteriores.
Pero, tal vez muchos no lo sepan porque este tip no se menciona en la documentación oficial de Laravel pero tenemos una forma elegante de insertar registros con transacciones en Eloquent.
// En vez de usar esto: DB::transaction(function () use ($user) { $user->save(); }); // Podes usar esto: $user->saveOrFail();
Y no solo sirve para guardar registros, también lo podemos utilizar para actualizar:
// En vez de usar esto: DB::transaction(function () use ($user) { $user->save(['name' => 'Juan']); }); // Podes usar esto: $user->saveOrFail(['name' => 'Juan']);
Conclusión
Hicimos un repaso sobre que son las transacciones y como implementarlas en Laravel con Eloquent. El tip nos ayuda a tener un código mas elegante y fácil de entender.
¡Artesanos del código, espero que les haya gustado este Laravel Tip y nos vemos en la próximo! 😉🤙
Si mi transaccion es con dos tablas sera asi els codigo? :
$user->saveOrFail();
$post->saveOrFail():
Si, pero se ejecuta en 2 transacciones distintas. Con esta función no podes ejecutar mas de una query en una sola trancción
Ya me habia emocionado …
Excelente pagina.
Hola, como puedo usar las transacciones incluyendo el save de otro controlador? por ejemplo:
Controlador1{
startTransaccion:
save1();
save2();
$var = llamaOtroController2($objeto);
$var2 = llamaOtroController3($objeto2);
//Ocurre un error en esta var2 pero controller2 ya se guardo el registrpo
como hago rollback en ese controlador????
commit::
}
Encontraste solución para esto??