11

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

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

cacheCounter当我改变一个人的来源的价值时,效果很好。它递增Source.Person_Count。凉爽的。

但是当它增加时,它会将它添加到一个人的目标源中,但不会从旧值中删除它。我试过updateCacheControl()afterSave,但这并没有做任何事情。

然后我在我的模型中编写了一些代码,用于afterSave减去源 source_id,但即使我什至没有更改source_id. (所以计数变为负数)。

我的问题:有没有办法判断模型中的字段是否已更改CakePHP

4

7 回答 7

17

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

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;
}
于 2008-09-26T10:04:22.300 回答
8

参考Alexander Morland答案。

这个怎么样,而不是在过滤器之前循环它。

$result = array_diff_assoc($this->old[$this->alias],$this->data[$this->alias]);

您还将获得关键和价值。

于 2012-08-24T05:38:50.330 回答
0

编辑很少发生,所以在你更新之前再做一次选择没什么大不了的,所以,在你保存之前获取记录,保存它,将编辑表单中提交的数据与你在保存之前从数据库中获取的数据进行比较,如果它不同,做点什么。

于 2008-09-23T19:52:31.210 回答
0

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

echo $form->input('field_to_monitor');
echo $form->hidden('field_to_monitor_prev', array('value'=>$form->value('field_to_monitor')));
于 2008-09-23T20:02:03.807 回答
0

您可以在实体中使用 ->isDirty() 来查看字段是否已被修改。

// Prior to 3.5 use dirty()
$article->isDirty('title');

check the doc: https://book.cakephp.org/3/en/orm/entities.html#checking-if-an-entity-has-been-modified

于 2020-08-18T17:50:08.400 回答
-1

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

于 2008-09-23T09:15:55.733 回答
-1

您可以在任何模型类上调用 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();
    }
于 2011-09-13T20:49:10.513 回答