2

由于在 CakePHP 中似乎不支持乐观锁定,因此我正在尝试构建一个实现它的行为。在对行为进行了一些研究之后,我想我可以在 beforeSave 事件中运行一个查询来检查版本字段是否没有改变。

但是,我宁愿通过将更新语句的 WHERE 子句从

WHERE id = ?

WHERE id = ? and version = ?

这样我就不必担心其他请求会在我读取版本和执行更新之间更改数据库记录。这也意味着我可以进行一次数据库调用而不是两次。

我可以看到该DboSource.update()方法支持条件,但从Model.save()不向它传递任何条件。

似乎我有几个选择:

  1. 办理登机手续beforeSave()并接受它不是防弹的事实。
  2. 破解我的本地 CakePHP 副本以检查数组中的conditions键并将其传递给方法。optionsModel.save()DboSource.update()

现在,我倾向于第二种选择,但这意味着我不能与其他用户分享我的行为,除非他们将我的 hack 应用到他们的框架中。

我错过了一个更简单的选择吗?

4

2 回答 2

10

save()用于更新记录时,Cake 期望 anid存在,并且只会用 this 更新记录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")
);
于 2009-09-26T05:23:41.727 回答
-1

我开始破解我的本地 CakePHP 副本。我最近没有查看最新版本的 CakePHP 是否提供任何新选项。

于 2012-08-08T22:21:19.813 回答