La primera forma es encerrar explícitamente las llamadas a los métodos de Active Record en un bloque transaccional, como se muestra a continuación:
$cliente = Cliente::findOne(123);
Cliente::getDb()->transaction(function($db) use ($cliente) {
$cliente->id = 200;
$cliente->save();
// ...otras operaciones BD ...
});
// o alternativamente
$transaction = Cliente::getDb()->beginTransaction();
try {
$cliente->id = 200;
$cliente->save();
// ...otras operaciones BD ...
$transaction->commit();
} catch(\Exception $e) {
$transaction->rollBack();
throw $e;
}
La segunda manera es hacer una lista de las operaciones de base de datos que requieren soporte transaccional en el método yii\db\ActiveRecord::transactions(). Por ejemplo:
class Cliente extends ActiveRecord
{
public function transactions()
{
return [
'admin' => self::OP_INSERT,
'api' => self::OP_INSERT | self::OP_UPDATE | self::OP_DELETE,
// lo anterior es equivalente a:
// 'api' => self::OP_ALL,
];
}
}
El método yii\db\ActiveRecord::transactions() debe devolver una matriz cuyas claves son los nombres de los escenarios y los valores correspondientes a las operaciones que deberían ser encapsuladas dentro de las transacciones. Se debe utilizar las siguientes constantes para referirse a las operaciones de base de datos:
- OP_INSERT : operación de inserción realizado por: insert() ;
- OP_UPDATE : operación de actualización realizada por: update() ;
- OP_DELETE : operación de eliminación realizada por delete() .
Hay que utilizar el símbolo de barra vertical ( | ) para concatenar más de una operación. También se puede utilizar OP_ALL para referirse a las tres operaciones.
También te puede interesar:
Consulta de Datos
Almacenamiento de Datos
Active Record (Registro Activo)
No hay comentarios.:
Publicar un comentario
Nota: sólo los miembros de este blog pueden publicar comentarios.