You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CakePHP 3执行更新操作时如何不修改modified字段?

CakePHP 3 单次保存操作不更新modified字段的解决方法

你在CakePHP2中使用的modified => false写法在CakePHP3中不生效,是因为3.x版本的Timestamp行为优先级更高,会自动覆写你传入的该字段值,且默认情况下modified字段不在批量赋值的允许列表中。以下是三种仅对当前操作生效、不修改全局配置的可行方案:


方案1:显式指定modified字段保留原值

手动保留原记录的modified时间,保存时强制覆盖自动生成的时间值:

// 示例为更新id为123的记录
$entity = $this->MyTable->get(123);
$originalModified = $entity->modified;

$entity = $this->MyTable->patchEntity($entity, [
    'field_1' => 'bla',
    'field_2' => 'blu',
    'modified' => $originalModified
], [
    // 加入fieldList允许modified字段被批量赋值
    'fieldList' => ['field_1', 'field_2', 'modified']
]);
$this->MyTable->save($entity);

方案2:临时关闭本次操作的Timestamp行为触发

不需要处理modified字段值,仅临时禁用自动更新逻辑,操作完成后自动恢复配置:

// 获取当前表的Timestamp行为实例
$timestampBehavior = $this->MyTable->behaviors()->get('Timestamp');
// 临时关闭modified字段的自动更新规则
$timestampBehavior->setConfig('events.Model.beforeSave.modified', false);

// 执行正常保存逻辑
$entity = $this->MyTable->get(123);
$entity = $this->MyTable->patchEntity($entity, [
    'field_1' => 'bla',
    'field_2' => 'blu'
]);
$this->MyTable->save($entity);

// 恢复配置,不影响后续其他操作
$timestampBehavior->setConfig('events.Model.beforeSave.modified', true);

方案3:使用updateAll直接更新(适合简单场景)

如果不需要触发实体回调、规则校验等逻辑,可以直接调用updateAll方法跳过所有ORM自动字段填充:

$this->MyTable->updateAll(
    ['field_1' => 'bla', 'field_2' => 'blu'],
    ['id' => 123]
);

内容的提问来源于stack exchange,提问作者user3870081

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:57:03