微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Fatfree 框架的 ORM 执行条件更新

如何解决如何使用 Fatfree 框架的 ORM 执行条件更新

这种情况包括尝试将 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 应该是某个值的子句的模型?

解决方法

假设 $instanceDB\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。您的代码应该处理这种情况。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。