题
我在 CakePHP
中使用 cacheCounter
,它会增加相关字段的计数器。
示例,我有一个Person表和一个Source表。 Person.source_id映射到Source表中的一行。每个人都有一个Source,每个Source都没有或很多Person行。
当我更改某人的来源值时, cacheCounter
工作正常。它增加 Source.Person_Count
。凉。
但是当它递增时,它会将其添加到某人的目标源,但不会将其从旧值中删除。我在 afterSave
中尝试了 updateCacheControl()
,但是没有做任何事情。
然后我在我的模型中为 afterSave
编写了一些代码,它们会减去源source_id,但即使我甚至没有更改 source_id
,它总是这样做。 (所以计数变为负数)。
我的问题:有没有办法判断 CakePHP
中模型中的字段是否已更改?
解决方案
要监控字段中的更改,您可以在模型中使用此逻辑,而不需要在其他位置进行更改:
function beforeSave() {
$this->recursive = -1;
$this->old = $this->find(array($this->primaryKey => $this->id));
if ($this->old){
$changed_fields = array();
foreach ($this->data[$this->alias] as $key =>$value) {
if ($this->old[$this->alias][$key] != $value) {
$changed_fields[] = $key;
}
}
}
// $changed_fields is an array of fields that changed
return true;
}
其他提示
参考 Alexander Morland 答案。
如何在过滤之前循环使用它。
$result = array_diff_assoc($this->old[$this->alias],$this->data[$this->alias]);
你也会获得关键和价值。
在编辑视图中,为要监视的字段包含另一个隐藏字段,但在字段名称后面添加类似“_prev”的字段名称。并将值设置为要监视的字段的当前值。然后在控制器的编辑操作中,如果两个字段不相等,则执行某些操作。 e.g。
echo $form->input('field_to_monitor');
echo $form->hidden('field_to_monitor_prev', array('value'=>$form->value('field_to_monitor')));
编辑很少发生,因此在进行更新之前进行另一次选择并不是什么大问题,因此,在保存之前获取记录,保存,将编辑表单中提交的数据与您之前从数据库中提取的数据进行比较保存它,如果它不同,做点什么。
查看“保存”是否使用某种返回“受影响的行”的DBAL调用,通常这是判断最后一个查询是否更改了数据,或者是否更改数据的方法。因为如果没有,UPDATE语句后受影响的行为0。
您可以在任何模型类上调用getAffectedRows()。
来自班级模特:
/**
* Returns the number of rows affected by the last query
*
* @return int Number of rows
* @access public
*/
function getAffectedRows() {
$db =& ConnectionManager::getDataSource($this->useDbConfig);
return $db->lastAffected();
}