El ORM de Eloquent es bastante bueno, aunque me pregunto si hay una manera fácil de configurar transacciones MySQL usando innoDB de la misma manera que PDO, o si tendría que extender el ORM para que esto sea posible.
96
Puedes hacerlo:
DB::transaction(function() {
//
});
Todo dentro del cierre se ejecuta dentro de una transacción. Si ocurre una excepción, se revertirá automáticamente.
Discussed in more detail here
el enlace está muerto.Si no le gustan las funciones anónimas:
Actualización : para laravel 4, el
pdo
objeto ya no es público, así que:fuente
DB::beginTransaction()
&DB::commit()
&DB::rollback()
. Eso sería un poco más limpio.DB::connection()->getPdo()->beginTransaction();
DB::transaction
devolución de llamada con es aún más limpia, pero el inconveniente es que si necesita especificar diferentes controladores para diferentes excepciones, tendrá que volver a intentar / atrapar la técnicaSi desea utilizar Eloquent, también puede utilizar este
Este es solo un código de muestra de mi proyecto
fuente
question->id
expresión en la devolución de llamada de la transacción devuelve cero.Si desea evitar los cierres y está feliz de usar fachadas, lo siguiente mantiene las cosas agradables y limpias:
Si alguna declaración falla, la confirmación nunca llegará y la transacción no se procesará.
fuente
Estoy seguro de que no está buscando una solución de cierre, pruebe esto para obtener una solución más compacta
fuente
Por alguna razón, es bastante difícil encontrar esta información en cualquier lugar, así que decidí publicarla aquí, ya que mi problema, aunque estaba relacionado con las transacciones de Eloquent, estaba cambiando esto exactamente.
Después de leer ESTO respuesta de stackoverflow, me di cuenta de que las tablas de mi base de datos usaban MyISAM en lugar de InnoDB.
Para que las transacciones funcionen en Laravel (o en cualquier otro lugar, como parece), es necesario que sus tablas estén configuradas para usar InnoDB
¿Por qué?
Citando documentos de transacciones MySQL y operaciones atómicas ( aquí ):
fuente
Si ocurre alguna excepción, la transacción se revertirá automáticamente.
Formato de transacción básico de Laravel
fuente