由于似乎没有对optimistic locking in CakePHP的任何支持,我正在尝试构建实现它的行为。在对行为进行一些研究之后,我想我可以在beforeSave事件中运行查询以检查版本字段是否未更改。
但是,我宁愿通过从
更改update语句的WHERE子句来实现检查WHERE id = ?
到
WHERE id = ? and version = ?
这样我就不必担心在我读取版本和执行更新的时间之间更改数据库记录的其他请求。这也意味着我可以进行一次数据库调用,而不是两次。
我可以看到DboSource.update()
方法支持条件,但Model.save()
从不传递任何条件。
似乎我有几个选择:
beforeSave()
并确认其不是防弹的。conditions
options
数组Model.save()
中的DboSource.update()
密钥,并将其传递给{{1}}方法。现在,我倾向于支持第二个选项,但这意味着我不能与其他用户分享我的行为,除非他们将我的黑客应用到他们的框架中。
我错过了一个更简单的选择吗?
答案 0 :(得分:10)
使用save()
更新记录时,Cake希望id
出现,并且只会使用此id
更新记录。
您要找的是updateAll()
:
<强>
updateAll(array $fields, array $conditions)
强>在一次通话中更新许多记录。要更新的记录由$ conditions数组标识,要更新的字段及其值由$ fields数组标识。
例如,要批准所有成员超过一年的面包师,更新电话可能如下所示:
$this_year = date('Y-m-d h:i:s', strtotime('-1 year')); $this->Baker->updateAll( array('Baker.approved' => true), array('Baker.created <=' => "$this_year") );
答案 1 :(得分:-1)
我去黑客攻击了CakePHP的本地副本。我最近没有看过最新版本的CakePHP是否提供任何新选项。