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

Don*_*kby 2 php cakephp optimistic-locking

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

但是,我宁愿通过更改update语句的WHERE子句来实现检查

WHERE id = ?
Run Code Online (Sandbox Code Playgroud)

WHERE id = ? and version = ?
Run Code Online (Sandbox Code Playgroud)

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

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

看起来我有几个选择:

  1. 办理入住手续beforeSave()并确保其不是防弹的.
  2. 破解CakePHP的本地副本以检查数组中的conditions键并将其传递给方法.optionsModel.save()DboSource.update()

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

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

dec*_*eze 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")
);
Run Code Online (Sandbox Code Playgroud)