3

这与 CakePHP 本质上是同一个问题:是否可以插入带有预定义主键值的记录?. 在 CakePHP 1.2 中,我想插入一条具有预定 id 的记录。id 的值由外部系统确定,但与链接问题不同,我无法控制该系统,因此该问题的解决方案对我来说不是一个选项。

如果调用时设置了模型的 id 字段$model->save(),Cake 将始终尝试更新记录。false如果不存在具有该 id 的记录,Cake 甚至会将 id 设置为[1]:

<?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 。

保存记录后,我无法调用外部进程。我也根本无法修改外部流程。


[1] http://api12.cakephp.org/view_source/model/#l-1260

4

1 回答 1

10

如果您想创建具有特定 id 的记录,请确保填写 id 字段

   $this->data['ModelName']['id'] = $your_id;

同样在调用之前:

    $this->save($this->data);

你应该记得打电话

$this->create();

这将重置模型状态,让您创建新记录。最后你应该尝试:

   $this->ModelName->create(); 
   $this->ModelName->save($this->data);

另一方面,当我阅读您的帖子并尝试想象您的表结构时,我建议您考虑单独保留 id 字段并尝试使该外键 id 成为外键。这对你来说是一个选择吗?

于 2012-09-24T12:03:31.313 回答