如何在CakePHP中强制执行插入操作(适配MySQL ARCHIVE引擎表)
嘿,我之前也碰到过CakePHP和MySQL ARCHIVE引擎的这个适配问题,刚好能帮到你!
问题回顾
我有一个基于MySQL ARCHIVE引擎的histories表,结构如下:
CREATE TABLE `histories` ( `uid` int(10) unsigned NOT NULL, `type` varchar(255) NOT NULL, `param` int(11) NOT NULL, `param2` varchar(255) NOT NULL, `time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
这个表完全不需要自增ID列,结构和引擎都满足需求。但用CakePHP的常规保存代码时:
$this->History->create(); $this->History->save(['uid' => uid, 'type' => 'deleted_entry', 'param' => $thing_id]);
CakePHP会强制执行更新操作——这不仅不是我想要的,而且ARCHIVE引擎本身就不支持更新操作。查了下原因,是CakePHP自动把uid识别成了主键,所以默认走更新逻辑,又找不到强制插入的标识。另外我不想用$this->Model->query()直接写原生SQL。
完美解决方案
只需要在History模型里把$primaryKey设为null,之后调用$this->create()就能正常执行插入操作了:
class History extends AppModel { public $primaryKey = null; }
如果后续有特殊场景需要执行更新操作,也很简单,只需要在调用save()之前临时指定主键即可:
$this->History->primaryKey = 'uid';
内容的提问来源于stack exchange,提问作者Vael Victus
相关产品推荐
相关产品推荐

