How to perform a conditional update using Fatfree framework's ORM

Viewed 106

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?

1 Answers

Assuming that $instance is an instance of DB\SQL\Mapper and that stateMachine->apply($body['state']) modifies $instance->stateA, then it should be as simple as:

$instance = $f3->get('domainObject')->load(['id=?', $id]);

$stateMachine = new StateMachine($instance, $config);

$instance->save();

The save() method triggers an UPDATE query, only if a field has been changed.

NB: be careful that the load() method may return FALSE. Your code should handle that case.

Related