我可以在CakePHP的更新语句中添加一个条件吗?

时间:2009-09-25 23:26:59

标签: php cakephp optimistic-locking

由于似乎没有对optimistic locking in CakePHP的任何支持,我正在尝试构建实现它的行为。在对行为进行一些研究之后,我想我可以在beforeSave事件中运行查询以检查版本字段是否未更改。

但是,我宁愿通过从

更改update语句的WHERE子句来实现检查
WHERE id = ?

WHERE id = ? and version = ?

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

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

似乎我有几个选择:

  1. 办理登机手续beforeSave()并确认其不是防弹的。
  2. 破解我的CakePHP本地副本,检查conditions options数组Model.save()中的DboSource.update()密钥,并将其传递给{{1}}方法。
  3. 现在,我倾向于支持第二个选项,但这意味着我不能与其他用户分享我的行为,除非他们将我的黑客应用到他们的框架中。

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

2 个答案:

答案 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是否提供任何新选项。

相关问题