问题描述
这种情况包括尝试将 F3 ORM (MysqL) 与状态机一起使用。仅当原始状态允许发生转换时,事务/操作才应执行/持久化到数据库。
下面的代码加载对象,应用新状态,创建新事务,并尝试通过将记录更新为新状态来确保数据库中的状态符合预期。
$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();
即使更新和保存在同一个事务中,即使更新未能更新记录(比如 stateA
已更改),也会发生修改。
如何使用 F3 ORM 有条件地更新带有声明 stateA
应该是某个值的子句的模型?
解决方法
假设 $instance
是 DB\SQL\Mapper
的一个实例并且 stateMachine->apply($body['state'])
修改了 $instance->stateA
,那么它应该很简单:
$instance = $f3->get('domainObject')->load(['id=?',$id]);
$stateMachine = new StateMachine($instance,$config);
$instance->save();
save()
方法仅在字段已更改时触发 UPDATE
查询。
注意:注意 load()
方法可能返回 FALSE
。您的代码应该处理这种情况。