这与CakePHP: Is it possible to insert record with pre-defined primary key value?基本相同。在CakePHP 1.2中,我想插入一个具有预定ID的记录。 id的值由外部系统决定,但与链接的问题不同,我无法控制该系统,因此该问题的解决方案不适合我。
如果在调用$model->save()
时设置了模型的id字段,Cake将始终尝试更新记录。如果已经存在具有该id的记录,Cake甚至会将id设置为false
:
<?php
function save($data = null, $validate = true, $fieldList = array()) {
// snip
if (!$this->__exists && $count > 0) {
$this->id = false;
}
// snip
}
首先保存模型然后手动更新id也不是一个选项,因为这会破坏参照完整性(这是我无法控制的架构限制)。
那么如何强制CakePHP插入具有特定主键的记录?
围绕我面临的问题的一些背景:
我正在处理的应用程序由Postgres数据库支持,因此新的主键由序列决定。有一个进程,外部系统将SELECT nextval('my_model_sequence')
,使用该ID执行一些操作,然后将其传递给CakePHP应用程序,我希望INSERT
具有该id的my_model记录。
保存记录后,我无法调用外部进程。我根本无法修改外部流程。
答案 0 :(得分:10)
如果您想创建具有特定ID的记录,请确保填写id字段
$this->data['ModelName']['id'] = $your_id;
在致电之前:
$this->save($this->data);
你应该记得打电话
$this->create();
将重置模型状态,以便您创建新记录。 最后你应该尝试:
$this->ModelName->create();
$this->ModelName->save($this->data);
另一方面,当我阅读你的帖子并试图想象你的表格结构时,我建议你考虑单独留下id字段并尝试将这个foreing id作为外键。这是你的选择吗?