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
相关产品推荐
相关产品推荐

