The situation consists of attempting to use F3 ORM (MySQL) with a state machine. A transaction/action should only be performed/persisted to the database if the original status allows for the transition to occur.
The code below loads the object, applies the new state, creates a new transaction, and attempts to ensure that the state in the database is as expected by updating the record to the new state.
$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();
Even though the update and the save is within the same transaction the modification occurs even if the update fails to update the record (say when the stateA has changed).
How can I use F3 ORM to conditionally update the model with a clause that states stateA should be a certain value?