La situación consiste en intentar usar F3 ORM (MySQL) con una máquina de estado. Una transacción/acción solo debe realizarse/mantenerse en la base de datos si el estado original permite que ocurra la transición.
El siguiente código carga el objeto, aplica el nuevo estado, crea una nueva transacción e intenta garantizar que el estado en la base de datos sea el esperado al actualizar el registro al nuevo estado.
$instance = $f3->get('domainObject')->load(['id=?', $id]); $stateMachine = new StateMachine($instance, $config); $originalState = $instance->stateA; $stateMachine->apply($body['state']); $db->begin(); $db->exec( 'UPDATE domainObject SET stateA=? WHERE stateA=?', $instance->stateA, $originalState ); $instance->save(); $db->commit(); Aunque la actualización y el guardado están dentro de la misma transacción, la modificación ocurre incluso si la actualización no actualiza el registro (por ejemplo, cuando el stateA ha cambiado).
¿Cómo puedo usar F3 ORM para actualizar condicionalmente el modelo con una cláusula que establece que stateA debe tener un valor determinado?
Suponiendo que $instance es una instancia de DB\SQL\Mapper y que stateMachine->apply($body['state']) modifica $instance->stateA , entonces debería ser tan simple como:
$instance = $f3->get('domainObject')->load(['id=?', $id]); $stateMachine = new StateMachine($instance, $config); $instance->save(); El método save() activa una consulta de UPDATE , solo si se ha cambiado un campo.
NB: tenga cuidado de que el método load() pueda devolver FALSE . Su código debe manejar ese caso.