在CakePHP中,如何确定在编辑操作中是否更改了字段?

时间:2020-03-06 14:32:49  来源:igfitidea点击:

我在CakePHP中使用了cacheCounter,它为相关字段增加了一个计数器。

例如,我有一个Person表和Source表。 Person.source_id映射到Source表中的一行。每个人都有一个源,每个源都没有一行或者很多行。

当我更改某个人的来源的值时,cacheCounter的工作效果很好。它增加Source.Person_Count。凉爽的。

但是,当它递增时,会将其添加到某个人的目标源,但不会将其从旧值中删除。我在afterSave中尝试了updateCacheControl(),但是没有做任何事情。

因此,然后我在模型中为" afterSave"编写了一些代码,该代码将减去源source_id,但是即使我什至没有更改" source_id",它也总是这样做。 (因此计数变为负数)。

我的问题:有没有办法判断在" CakePHP"模型中是否更改了某个字段?

解决方案

看看"保存"是否使用某种DBAL调用返回"受影响的行",通常这是我们可以判断上一个查询是否更改了数据或者是否没有更改的方法。因为如果没有,则UPDATE语句后受影响的行为0。

编辑很少进行,因此在进行更新之前的另一个选择没什么大不了的,因此,在保存之前获取记录,保存它,将在编辑表单中提交的数据与从数据库中获取的数据进行比较,然后再保存,如果有所不同,请执行某些操作。

在编辑视图中,为要监视的字段添加另一个隐藏字段,但在字段名后加上" _prev"作为后缀,并将其值设置为要监视的字段的当前值。然后,在控制器的编辑操作中,如果两个字段不相等,请执行某些操作。例如

echo $form->input('field_to_monitor');
echo $form->hidden('field_to_monitor_prev', array('value'=>$form->value('field_to_monitor')));

要监视字段中的更改,可以在模型中使用此逻辑,而无需在其他地方进行更改:

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;
}